为什么没有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); }