2009-05-22 3 views
2

Wenn Sie auf einen Knoten in einem TeeView mit OwnerDrawAll klicken, wird es nicht ausgewählt, bis es eine Maus empfängt, die ein anderes Verhalten als der Standardmodus und offensichtlich nicht korrekt ist. Hat jemand eine Lösung dafür?TreeView Fehler in WindowsForms bei Verwendung von OwnerDrawAll

den Code ausführen unterhalb dieses Verhalten zu sehen:

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); 
    } 
} 

Antwort

0

Take a look at this page from Microsoft. Ich habe den mousedown-Handler und die NodeBounds-Methode zu Ihrem Beispiel hinzugefügt und es schien zu funktionieren, wie man es erwarten würde. Ein bisschen Ärger, nehme ich an, aber es schien den gewünschten Effekt zu geben.


Nun, Sie könnten dies versuchen. Vielleicht ist es besser:

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; 
     } 
    } 
} 

ich gerade gesetzt treeView1.LabelEdit = anfänglich falsch. Und es schien näher zu kommen, was du willst.

+0

Danke, aber das löst das Problem nicht, denn wenn Sie auf ein Knotenlabel klicken, wird es immer editierbar. Was nicht eigentlich eine Beschriftung sein sollte, sollte editierbar sein, wenn Sie auf einen bereits ausgewählten Knoten klicken –

+0

Sehen Sie sich meinen hinzugefügten Code an. Es schien ein bisschen besser zu funktionieren. – itsmatt

Verwandte Themen