我有一个带复选框的树视图,我试图仅在复选框中完成此操作时才禁用双击。
我找到了一种完全禁用双击的方法,但这不是我想要的。
如果您能帮助我,我将不胜感激。
我在谷歌搜索相同的错误时发现了这个问题。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 类:树视图 { 受保护的覆盖无效 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 更直观。当用户单击该复选框两次时,该复选框未被选中。
如果您只想知道复选框中发生的 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
}
结合以上答案,我发现这对我来说是最好的解决方案。双击节点以展开其子节点仍然有效,只有双击复选框会受到影响并修复:
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);
}
}