【发布时间】:2010-12-12 20:54:48
【问题描述】:
System.Web.UI.WebControls.TreeView 类提供此事件,但 TreeView 的 Forms 版本不提供。 Forms 世界中的等价物是什么?我正在使用 AfterSelect,但它似乎不太正确。也许它实际上是我正在寻找的,但文档有点模糊。
【问题讨论】:
System.Web.UI.WebControls.TreeView 类提供此事件,但 TreeView 的 Forms 版本不提供。 Forms 世界中的等价物是什么?我正在使用 AfterSelect,但它似乎不太正确。也许它实际上是我正在寻找的,但文档有点模糊。
【问题讨论】:
WinForms TreeView 中没有。引用 MSDN 为TreeView.AfterSelect:
取消选择节点时不会发生此事件。要检测这种情况,请处理 Control.MouseUp 事件并测试 TreeNode.IsSelected 属性。
是的,这很糟糕。
【讨论】:
AfterSelect 事件。
TreeView 的Sorted 属性设置为True 将取消选择SelectedNode。如果你需要这个,你可以把它放在构造函数中而不是Load事件中,因为它可能会取消选择你已经预先以编程方式选择的节点。
使用AfterSelect没有任何问题。
但是,请注意,如果选择被清除(如果 SelectedNode 变为 null),它不会触发。相反,您可以按照 documentation 中的建议处理 MouseUp。
【讨论】:
MouseUp 时,树视图的 SelectedNode 属性尚未更新。
好的,这是一个 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 事件并测试 TreeNode.IsSelected 属性。
您最好将 TreeView.NodeMouseClick 事件与 AfterSelect 结合使用。当您选择先前选择的 SelectedNode 时,不会调用 AfterSelect。所以只要在需要的时候调用 AfterSelect,e.Node 就可以帮助你。
private void treeView1_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e)
{
if (e.Node == tv.SelectedNode)
treeView1_AfterSelect(sender, null);
}
【讨论】: