簡體   English   中英

C#System.Windows.Forms.TreeView:雙擊停止自動展開/折疊(並執行另一個處理程序)

[英]C# System.Windows.Forms.TreeView: Stop auto expand/collapse on double-click (and execute another handler)

是否有一種簡單的方法可以在雙擊時禁用TreeView節點的自動展開/折疊? 我一直無法找到這個問題的答案,如果當前系統時間與雙擊所預期的系統時間匹配,則無需檢查BeforeExpand / BeforeCollapse即可運行 - 覆蓋OnNodeMouseDoubleClick和/或OnDoubleClick似乎不夠。

或者,檢查系統時間,看它是否適合雙擊唯一的方法來做到這一點?

謝謝你的幫助,-Walt

解決:實際上,整個解決方案是在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;
}

到目前為止我找到的任何答案都沒有太多運氣,但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;
}

然而這個線程已經老了...我沒有找到解決這個問題的簡單方法,所以我自己進行了調查。 這是結果:

繼承一個專門的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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM