Подтвердить что ты не робот

Почему нет события SelectedNodeChanged для Windows.Forms.TreeView?

Класс System.Web.UI.WebControls.TreeView предлагает это событие, но версия TreeS для форм не поддерживает. Какой эквивалент в мире Форм? Я использую AfterSelect, но это не кажется правильным. Возможно, это на самом деле то, что я ищу, но документация немного туманна.

4b9b3361

Ответ 1

В WinForms TreeView нет ни одного. Чтобы процитировать MSDN для TreeView.AfterSelect:

Это событие не возникает, если node не выбран. Чтобы обнаружить это событие, обработайте событие Control.MouseUp и проверьте свойство TreeNode.IsSelected.

Да, это отстой.

Ответ 2

Нет ничего плохого в использовании AfterSelect.

Однако обратите внимание, что он не срабатывает, если выбор очищается (если SelectedNode становится null) Вместо этого вы можете обрабатывать MouseUp, как рекомендовано в документация.

Ответ 3

ОК, это вопрос OOOLD, но проблема действительно меня раздражает. Я сделал этот небольшой вспомогательный класс - он работает для меня.

Public Class TreeViewSelectedNodeChangeEventHandler
Public Event SelectedTreeNodeChanged(sender As Object, e As EventArgs)

Private m_selectedNode As TreeNode
Private WithEvents m_tvw As TreeView

Public Shared Function FromTree(tree As TreeView) As TreeViewSelectedNodeChangeEventHandler
    If Not IsNothing(tree) Then
        Return New TreeViewSelectedNodeChangeEventHandler(tree)
    End If
    Return Nothing
End Function

''' <summary>Assigns 'Value' to 'this' and returns 'Value'.</summary>
Private Function InLineAssign(Of V)(ByRef this As V, value As V) As V
    Dim ret = value
    this = value
    Return ret
End Function

Может добавлять другие триггеры, например. Control.Enter, MouseUp и т.д. И т.д.

Private Sub keyUp(sender As Object, e As KeyEventArgs) Handles m_tvw.KeyUp
    If Not Me.m_selectedNode Is InLineAssign(Me.m_selectedNode, m_tvw.SelectedNode)  

Тогда

    RaiseEvent SelectedTreeNodeChanged(m_tvw, EventArgs.Empty)
        End If
    End Sub
    Private Sub New(tv As TreeView)
        m_tvw = tv
    End Sub
End Class

Ответ 4

В WinForms TreeView нет ни одного. Чтобы процитировать MSDN для TreeView.AfterSelect:

Это событие не возникает, если node не выбран. Чтобы обнаружить это событие, обработайте событие Control.MouseUp и проверьте свойство TreeNode.IsSelected.

Вам лучше использовать событие TreeView.NodeMouseClick в сочетании с AfterSelect. AfterSelect не вызывается при выборе ранее выбранного SelectedNode. Поэтому просто вызовите AfterSelect при необходимости, e.Node поможет вам.

private void treeView1_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e)
    {
        if (e.Node == tv.SelectedNode)
            treeView1_AfterSelect(sender, null);
    }