C#System.Windows.Forms.TreeView:停止双击自动展开/折叠(并执行另一个处理程序)

是否有一个简单的方法来禁用自动展开/折叠的TreeView节点时,它是双击? 我一直无法find这个问题的答案,没有检查BeforeExpand / BeforeCollapse如果当前系统时间匹配双击预期的重写 – 重写OnNodeMouseDoubleClick和/或OnDoubleClick似乎不够。

或者,检查系统时间,看看是否适合双击这样做的唯一方法?

感谢您的帮助, – 重要

解决:实际上,整个解决方案是在http://www.developersdex.com/gurus/code/831.asp 。 显然OnNodeMouseDoubleClick()没有在TreeView的WM_LBUTTONDBLCLK处理程序中调用。 。 。 它在LBUTTONUP处理程序中调用。 所以,下面是该网站的内容:

protected override void DefWndProc(ref Message m) { if (m.Msg == 515) { /* WM_LBUTTONDBLCLK */ } else base.DefWndProc(ref m); } 

如果要停止对节点左侧的处理,请在OnNodeMouseDoubleClick()中执行以下操作:

 if (eX >= e.Node.Bounds.Left) { return; } 

迄今为止我找到的答案都没有太多的运气,但沃尔特的答案提供了这样的灵感:

 int treeX; // somewhere in class scope // Add a MouseMove event handler private void treeView1_MouseMove(object sender, MouseEventArgs e) { treeX = eX; } // Add a BeforeExpand event handler private void treeView1_BeforeExpand(object sender, TreeViewCancelEventArgs e) { if (treeX > e.Node.Bounds.Left) e.Cancel = true; } 

然而,这个线程是旧的…我没有找到这个问题的简单解决方案,所以我自己调查。 这是结果:

从Treeview继承一个具有所需行为的专门Treeview。 重写MouseDown并检查它是否是双击。 如果是这样,通过设置一个标志来抑制行动,防止扩张/崩溃。 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