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

时间:2009-08-20 18:06:25

标签: c# windows treeview

双击时是否有简单方法禁用TreeView节点的自动展开/折叠?我一直无法找到这个问题的答案,如果当前系统时间与双击所预期的系统时间匹配,则无需检查BeforeExpand / BeforeCollapse即可运行 - 覆盖OnNodeMouseDoubleClick和/或OnDoubleClick似乎不够。

或者,检查系统时间并查看它是否适合双击唯一的方法来执行此操作?

感谢您的帮助, -Walt

3 个答案:

答案 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