Fix the annoying TreeView DoubleClick-Expand event

keitsi

Freshman
Joined
Apr 3, 2004
Messages
30
Location
Finland
VB.NET code to prevent Expand() and Collapse() from firing when TreeView is doubleclicked.

Add this class to your project:
Code:
    'DoubleClick-expand restriction hack
    Public Class cTreeViewDblClickHack
        Private WithEvents m_tv As TreeView
        Public Sub New(ByVal tv As TreeView)
            m_tv = tv
        End Sub
        Private m_FirstMouseDownTime As Long
        Private blnDoubleClick As Boolean = False
        Private Sub tv_BeforeExpand(ByVal sender As Object, _
                                    ByVal e As System.Windows.Forms.TreeViewCancelEventArgs) _
                                    Handles m_tv.BeforeExpand
            If blnDoubleClick AndAlso e.Action = TreeViewAction.Expand Then
                e.Cancel = True
            Else
                m_FirstMouseDownTime = 0
            End If
        End Sub

        Private Sub tv_BeforeCollapse(ByVal sender As Object, _
                                      ByVal e As System.Windows.Forms.TreeViewCancelEventArgs) _
                                      Handles m_tv.BeforeCollapse
            If blnDoubleClick AndAlso e.Action = TreeViewAction.Collapse Then
                e.Cancel = True
            Else
                m_FirstMouseDownTime = 0
            End If
        End Sub

        Private Sub tv_MouseDown(ByVal sender As Object, _
                                 ByVal e As System.Windows.Forms.MouseEventArgs) _
                                 Handles m_tv.MouseDown
            If Now.Ticks - m_FirstMouseDownTime <= (SystemInformation.DoubleClickTime * TimeSpan.TicksPerMillisecond) Then
                blnDoubleClick = True
            Else
                blnDoubleClick = False
            End If
            m_FirstMouseDownTime = Now.Ticks
        End Sub
    End Class

And use it in your Form like this:
Code:
    Private m_TreeViewDblClickHack As cTreeViewDblClickHack
    Public Sub New()
        MyBase.New()
        'This call is required by the Windows Form Designer.
        InitializeComponent()

        'Add any initialization after the InitializeComponent() call
        m_TreeViewDblClickHack = New cTreeViewDblClickHack(Me.tv)
    End Sub

TreeView is an annoying piece of **** :(

I got the idea from here:
http://www.windowsforms.net/Forums/ShowPost.aspx?tabIndex=1&tabId=41&PostID=15689
 
Last edited:
Here is the C# equiv:

public class TreeDblClickPrevent
{
private TreeView m_tv;
public TreeDblClickPrevent(TreeView tv)
{
m_tv = tv;
tv.BeforeExpand +=new TreeViewCancelEventHandler(tv_BeforeExpand);
tv.MouseDown +=new MouseEventHandler(tv_MouseDown);
tv.BeforeCollapse += new TreeViewCancelEventHandler(tv_BeforeCollapse);
}
private long m_FirstMouseDownTime;
private bool blnDoubleClick = false;

private void tv_BeforeExpand(object sender, TreeViewCancelEventArgs e){ //handles m_tv.BeforeExpand
if(blnDoubleClick == true && e.Action == TreeViewAction.Expand)
e.Cancel = true;
else
m_FirstMouseDownTime = 0;
}

private void tv_BeforeCollapse(object sender, TreeViewCancelEventArgs e){ //Handles m_tv.BeforeCollapse
if(blnDoubleClick == true && e.Action == TreeViewAction.Collapse)
e.Cancel = true;
else
m_FirstMouseDownTime = 0;
}

private void tv_MouseDown(object sender,System.Windows.Forms.MouseEventArgs e){// Handles m_tv.MouseDown
if(System.DateTime.Now.Ticks - m_FirstMouseDownTime <= (SystemInformation.DoubleClickTime * TimeSpan.TicksPerMillisecond))
blnDoubleClick = true;
else
blnDoubleClick = false;
m_FirstMouseDownTime = System.DateTime.Now.Ticks;
}
}



Then in your form just pass the treeview in question to the attach the handlers:
TreeDblClickPrevent treep = new TreeDblClickPrevent(tvMain);
 
Back
Top