19

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

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

如果您能帮助我,我将不胜感激。

4

4 回答 4

15

我在谷歌搜索相同的错误时发现了这个问题。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);
    }
}

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

于 2013-04-02T09:37:25.323 回答
13

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

MyTreeView 类:树视图
{
    受保护的覆盖无效 WndProc(参考消息 m)
    {
        如果(m.Msg == 0x0203)
        {
            m.Result = IntPtr.Zero;
        }
        别的
        {
            base.WndProc(参考 m);
        }
    }
}

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

this.treeView1 = new MyTreeView();

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

MyTreeView 类:树视图
{
    受保护的覆盖无效 WndProc(参考消息 m)
    {
        如果(m.Msg == 0x0203)
        {
            m.Msg = 0x0201;
        }
        base.WndProc(参考 m);
    }
}

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

于 2013-02-07T18:44:10.833 回答
6

如果您只想知道复选框中发生的 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
}
于 2013-02-01T15:36:50.613 回答
5

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

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);
    }
}
于 2018-01-02T13:33:49.877 回答