为什么没有Windows.Forms.TreeView的SelectedNodeChanged事件?

System.Web.UI.WebControls.TreeView类提供这个事件,但是TreeView的Forms版本没有。 表单世界中的等价物是什么? 我使用的是AfterSelect,但看起来不太正确。 也许这是我正在寻找的东西,但是文档有点朦胧。

在WinForms TreeView中没有。 引用MSDN的TreeView.AfterSelect :

当节点未被选中时,这个事件不会发生。 要检测这种情况,请处理Control.MouseUp事件并testingTreeNode.IsSelected属性。

是的,这很糟糕。

使用AfterSelect没有任何问题。

但是请注意,如果select被清除,则不会触发(如果SelectedNode null ),则可以按照文档中的build议处理MouseUp

好的,这是一个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 

在WinForms TreeView中没有。 引用MSDN的TreeView.AfterSelect:

当节点未被选中时,这个事件不会发生。 要检测这种情况,请处理Control.MouseUp事件并testingTreeNode.IsSelected属性。

你最好使用TreeView.NodeMouseClick事件结合AfterSelect。 当您select之前select的SelectedNode时,不会调用AfterSelect。 所以只要在必要时调用AfterSelect,e.Node就可以帮助你。

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