2009-05-22 28 views
2

OwnerDrawAllを使用してTeeView内のノードをクリックすると、標準モードとは異なる振る舞いで、明らかに正しくないマウスを受け取るまで選択されません。誰にもこれに対する解決策がありますか?OwnerDrawAllを使用した場合のwindowsformのTreeViewバグ

は、この動作を確認するには、以下のコードを実行します。

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

答えて

0

Take a look at this page from Microsoft。あなたの例にmousedownハンドラとNodeBoundsメソッドを追加しました。期待どおりに動作するように見えました。ほんの少しの面倒ですが、それは望みの効果を与えるようでした。


これを試すことができます。おそらくそれは良いです:

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

私はtreeView1.LabelEdit = falseを最初に設定しました。そして、それはあなたが望むものに近づくようでした。

+0

ありがとうございますが、ノードラベルをクリックすると常に編集可能になるため、これで問題は解決しません。既に選択されているノードをクリックすると、ラベルになるはずの方法は編集可能になるはずです –

+0

私の追加したコードを見てください。もう少しうまくいくように見えました。 – itsmatt

関連する問題