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

时间:2009-11-04 01:07:58

标签: c# .net winforms treeview

System.Web.UI.WebControls.TreeView类提供此事件,但TreeView的Forms版本不提供此事件。形式世界中的等价物是什么?我正在使用AfterSelect,但它似乎不太正确。也许它实际上是我正在寻找的但文档有点模糊。

4 个答案:

答案 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