双击时是否有简单方法禁用TreeView节点的自动展开/折叠?我一直无法找到这个问题的答案,如果当前系统时间与双击所预期的系统时间匹配,则无需检查BeforeExpand / BeforeCollapse即可运行 - 覆盖OnNodeMouseDoubleClick和/或OnDoubleClick似乎不够。
或者,检查系统时间并查看它是否适合双击唯一的方法来执行此操作?
感谢您的帮助, -Walt
答案 0 :(得分:13)
解决:实际上,整个解决方案都在http://www.developersdex.com/gurus/code/831.asp。显然,在TreeView的WM_LBUTTONDBLCLK处理程序中根本没有调用OnNodeMouseDoubleClick()。 。 。它在LBUTTONUP处理程序中调用。那么,以下是该网站的内容:
protected override void DefWndProc(ref Message m) {
if (m.Msg == 515) { /* WM_LBUTTONDBLCLK */
}
else
base.DefWndProc(ref m);
}
如果要暂停节点左侧的处理,请在OnNodeMouseDoubleClick()中执行以下操作:
if (e.X >= e.Node.Bounds.Left) {
return;
}
答案 1 :(得分:0)
到目前为止我找到的任何答案都没有太多运气,但Walt的回答为此提供了灵感:
int treeX; // somewhere in class scope
// Add a MouseMove event handler
private void treeView1_MouseMove(object sender, MouseEventArgs e)
{
treeX = e.X;
}
// Add a BeforeExpand event handler
private void treeView1_BeforeExpand(object sender, TreeViewCancelEventArgs e)
{
if (treeX > e.Node.Bounds.Left) e.Cancel = true;
}
答案 2 :(得分:0)
然而这个线程已经老了......我没有找到解决这个问题的简单方法,所以我自己进行了调查。这是结果:
继承一个专门的Treeview,它具有Treeview所需的行为。 覆盖MouseDown并检查它是否为doubleclick。如果是这样,通过设置标志来阻止操作来防止扩展/崩溃。 如果设置了标志,则会覆盖BeforeExpand / collapse以取消操作。 如果需要,可以在BeforeExpand / Collapse-EventHandler中重置标志。
Public Class DblClickTreeview
Inherits TreeView
Private _SupressExpColl As Boolean = False
Private _LastClick As DateTime = Now
Protected Overrides Sub OnMouseDown(e As MouseEventArgs)
_SupressExpColl = Now.Subtract(_LastClick).TotalMilliseconds <= SystemInformation.DoubleClickTime
_LastClick = Now
MyBase.OnMouseDown(e)
End Sub
Protected Overrides Sub OnBeforeCollapse(e As TreeViewCancelEventArgs)
e.Cancel = _SupressExpColl
MyBase.OnBeforeCollapse(e)
End Sub
Protected Overrides Sub OnBeforeExpand(e As TreeViewCancelEventArgs)
e.Cancel = _SupressExpColl
MyBase.OnBeforeExpand(e)
End Sub
End Class