Класс System.Web.UI.WebControls.TreeView предлагает это событие, но версия TreeS для форм не поддерживает. Какой эквивалент в мире Форм? Я использую AfterSelect, но это не кажется правильным. Возможно, это на самом деле то, что я ищу, но документация немного туманна.
Почему нет события SelectedNodeChanged для Windows.Forms.TreeView?
Ответ 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);
}