C # System.Windows.Forms.TreeView: остановить автоматическое развертывание / сворачивание при двойном щелчке (и выполнить другой обработчик) - PullRequest
5 голосов
/ 20 августа 2009

Существует ли простой способ отключить автоматическое развертывание / свертывание узла TreeView при двойном щелчке по нему? Мне не удалось найти ответ на этот вопрос, который работает без проверки в BeforeExpand / BeforeCollapse, если текущее системное время совпадает с ожидаемым для двойного щелчка - переопределение OnNodeMouseDoubleClick и / или OnDoubleClick кажется недостаточным.

Или, проверяя системное время и проверяя, подходит ли оно двойным щелчком, единственный способ сделать это?

Спасибо за вашу помощь, -Walt

Ответы [ 3 ]

13 голосов
/ 21 августа 2009

Решено: На самом деле, весь раствор был на http://www.developersdex.com/gurus/code/831.asp. Очевидно, OnNodeMouseDoubleClick () вообще не вызывается в обработчике WM_LBUTTONDBLCLK для TreeView. , , он вызывается в обработчике 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;
}
0 голосов
/ 29 июня 2015

Тем не менее, эта ветка старая ... Я не нашел легкого решения этой проблемы, поэтому я провел собственное расследование. Это результат:

Наследовать специализированный 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
0 голосов
/ 21 октября 2012

Мне не повезло ни с одним из ответов, которые я нашел до сих пор, но ответ Уолта послужил источником вдохновения для этого:

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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...