c#treeview忽略仅双击复选框

时间:2013-02-01 13:20:43

标签: c# .net winforms treeview

我有一个带有复选框的树视图,我只是在复选框中完成此操作时才会禁用双击。

我找到了完全禁用双击的方法,但这不是我想要的。

如果你能帮助我,我感激不尽。

4 个答案:

答案 0 :(得分:12)

我在google搜索同一个bug时发现了这个问题。 NoodleFolk解决方案的问题在于它通过双击项目来禁用扩展三者。通过将NoodleFolk的答案与john arlens的答案结合起来,你会得到这样的结论:

class NewTreeView : TreeView
{
    protected override void WndProc(ref Message m)
    {
        if (m.Msg == 0x203) // identified double click
        {
            var localPos = PointToClient(Cursor.Position);
            var hitTestInfo = HitTest(localPos);
            if (hitTestInfo.Location == TreeViewHitTestLocations.StateImage)
                m.Result = IntPtr.Zero;
            else
                base.WndProc(ref m);
        }
        else base.WndProc(ref m);
    }
}

我(很快)测试了这个解决方案,它似乎有效。

答案 1 :(得分:11)

选项1 :完全禁用双击事件 创建客户控制

class MyTreeView : TreeView
{
    protected override void WndProc(ref Message m)
    {
        if (m.Msg == 0x0203)
        {
            m.Result = IntPtr.Zero;
        }
        else
        {
            base.WndProc(ref m);
        }
    }
}

在设计器文件(form.Designer.cs)中,查找控件的创建位置,并用新控件替换对TreeView构造函数的调用。

this.treeView1 = new MyTreeView();

选项2 :将双击事件视为两次单击事件

class MyTreeView : TreeView
{
    protected override void WndProc(ref Message m)
    {
        if (m.Msg == 0x0203)
        {
            m.Msg = 0x0201;
        }
        base.WndProc(ref m);
    }
}

我个人认为选项2更直观。当用户单击两次复选框时,不会选中该复选框。

答案 2 :(得分:4)

如果您只是想知道CheckBox发生的DoubleClick事件:

private void TreeViewDoubleClick(object sender, EventArgs e)
{
    var localPosition = treeView.PointToClient(Cursor.Position);
    var hitTestInfo = treeView.HitTest(localPosition);
    if (hitTestInfo.Location == TreeViewHitTestLocations.StateImage) 
        return;

    // ... Do whatever other processing you want
}

答案 3 :(得分:3)

结合上述答案,我发现这对我来说是最好的解决方案。双击某个节点以展开其子节点仍然有效,只有双击一个复选框才会受到影响并修复:

class MyTreeView : TreeView
{
    protected override void WndProc(ref Message m)
    {
      if (m.Msg == 0x0203 && this.CheckBoxes)
      {
        var localPos = this.PointToClient(Cursor.Position);
        var hitTestInfo = this.HitTest(localPos);
        if (hitTestInfo.Location == TreeViewHitTestLocations.StateImage)
        {
          m.Msg = 0x0201;
        }
      }
      base.WndProc(ref m);
    }
}