c#treeview忽略仅双击复选框
我有一个带有复选框的树视图,我试图在复选框中完成此操作时禁用双击。
我找到了完全禁用双击的方法,但这不是我想要的。
如果你能帮助我,我感激不尽。
如果您只想知道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 }
谷歌搜索相同的错误时我发现了这个问题。 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 :完全禁用双击事件。
创建客户控制
MyTreeView类:TreeView { protected override void WndProc(ref message m) { if(m.Msg == 0x0203) { m.Result = IntPtr.Zero; } 其他 { base.WndProc(ref m); } } }
并在您的设计器文件(form.Designer.cs)中,查找控件的创建位置,并用新控件替换对TreeView构造函数的调用。
this.treeView1 = new MyTreeView();
选项2 :将双击事件视为两个单击事件
MyTreeView类:TreeView { protected override void WndProc(ref message m) { if(m.Msg == 0x0203) { m.Msg = 0x0201; } base.WndProc(ref m); } }
我个人认为选项2更直观。 当用户单击两次复选框时,不会选中该复选框。
综合以上答案,我发现这对我来说是最好的解决方案。 双击某个节点以展开其子节点仍然有效,只有双击一个复选框才会受到影响并修复:
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); } }