System.Web.UI.WebControls.TreeView类提供此事件,但TreeView的Forms版本不提供此事件。形式世界中的等价物是什么?我正在使用AfterSelect,但它似乎不太正确。也许它实际上是我正在寻找的但文档有点模糊。
答案 0 :(得分:37)
WinForms TreeView中没有。引用TreeView.AfterSelect的MSDN:
取消选择节点时不会发生此事件。要检测此事件,请处理Control.MouseUp事件并测试TreeNode.IsSelected属性。
是的,这很糟糕。
答案 1 :(得分:10)
使用AfterSelect
没有错。
但是,请注意,如果清除了选择,则不会触发(如果SelectedNode
变为null
)相反,您可以按照{{3}中的建议处理MouseUp
}。
答案 2 :(得分:2)
好的,这是一个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
答案 3 :(得分:0)
WinForms TreeView中没有。为TreeView.AfterSelect引用MSDN:
取消选择节点时不会发生此事件。要检测此事件,请处理Control.MouseUp事件并测试TreeNode.IsSelected属性。
您最好将TreeView.NodeMouseClick事件与AfterSelect结合使用。选择以前选择的SelectedNode时,不会调用AfterSelect。所以只要在必要时调用AfterSelect,e.Node会帮助你。
products = Product.includes(:manufacturer, :images, :items).where(:id => product_ids).order("field(ID,#{product_ids.join(",")})").paginate