我有一个带有复选框的树视图,我只是在复选框中完成此操作时才会禁用双击。
我找到了完全禁用双击的方法,但这不是我想要的。
如果你能帮助我,我感激不尽。
答案 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);
}
}