2009-05-22 4 views
2

Lorsque vous cliquez sur un nœud dans un TeeView en utilisant OwnerDrawAll, il n'est pas sélectionné jusqu'à ce qu'il reçoive une souris qui est un comportement différent du mode standard et évidemment pas correct. Est-ce que quelqu'un a une solution à cela?TreeView bug dans windowsforms lors de l'utilisation OwnerDrawAll

Exécutez le code ci-dessous pour voir ce comportement:

public partial class Form1 : Form 
{ 
    private System.Windows.Forms.TreeView treeView1; 

    public Form1() 
    { 
     System.Windows.Forms.TreeNode treeNode1 = new System.Windows.Forms.TreeNode("Some Node"); 
     System.Windows.Forms.TreeNode treeNode2 = new System.Windows.Forms.TreeNode("Click Me Please!"); 
     this.treeView1 = new System.Windows.Forms.TreeView(); 

     this.treeView1.Dock = System.Windows.Forms.DockStyle.Fill; 
     this.treeView1.DrawMode = System.Windows.Forms.TreeViewDrawMode.OwnerDrawAll; 
     this.treeView1.FullRowSelect = true; 
     this.treeView1.LabelEdit = true; 
     treeNode1.Text = "Some Node"; 
     treeNode2.Text = "Click Me Please!"; 
     this.treeView1.Nodes.AddRange(new System.Windows.Forms.TreeNode[] {treeNode1, treeNode2}); 
     this.treeView1.DrawNode += new System.Windows.Forms.DrawTreeNodeEventHandler(this.treeView1_DrawNode); 

     Controls.Add(treeView1); 
    } 

    private void treeView1_DrawNode(object sender, DrawTreeNodeEventArgs e) 
    { 
     Rectangle nodeRect = e.Bounds; 
     Rectangle nodeBounds = e.Node.Bounds; 

     if (e.Node.IsSelected) { 
      e.Graphics.FillRectangle(Brushes.CornflowerBlue, nodeRect); 
     } 
     else { 
      e.Graphics.FillRectangle(Brushes.White, nodeRect); 
     } 
     TextRenderer.DrawText(e.Graphics, e.Node.Text, Font, nodeBounds, System.Drawing.Color.Black, Color.Transparent, TextFormatFlags.VerticalCenter | TextFormatFlags.NoClipping); 
    } 
} 

Répondre

0

Take a look at this page from Microsoft. J'ai ajouté le gestionnaire de mousedown et la méthode NodeBounds à votre exemple et il a semblé fonctionner comme on pouvait s'y attendre. Un peu de tracas, je suppose, mais il semblait donner l'effet désiré.


Eh bien, vous pouvez essayer cela. Peut-être est-ce mieux:

private void treeView1_MouseDown(object sender, MouseEventArgs e) 
{ 
    TreeNode clickedNode = treeView1.GetNodeAt(e.X, e.Y); 
    if (NodeBounds(clickedNode).Contains(e.X, e.Y)) 
    { 
     if (treeView1.SelectedNode != clickedNode) 
     { 
     treeView1.SelectedNode = clickedNode; 
     treeView1.LabelEdit = false; 
     } 
     else 
     { 
     treeView1.LabelEdit = true; 
     } 
    } 
} 

Je viens de définir treeView1.LabelEdit = false initialement. Et il semblait se rapprocher de ce que vous voulez.

+0

Merci, mais cela ne résout pas le problème car lorsque vous cliquez sur une étiquette de noeud, elle devient toujours modifiable. Ce qui n'est pas la façon dont il est censé être un label devrait devenir modifiable lorsque vous cliquez sur un nœud qui a déjà été sélectionné –

+0

Jetez un oeil à mon code ajouté. Cela semblait fonctionner un peu mieux. – itsmatt