代码之家  ›  专栏  ›  技术社区  ›  I. J. Kennedy ShankarSangoli

为什么没有针对windows.forms.treeview的SelectedNodeChanged事件?

  •  37
  • I. J. Kennedy ShankarSangoli  · 技术社区  · 15 年前

    System.Web.UI.WebControls.TreeView类提供了此事件,但TreeView的窗体版本不提供。窗体世界中的等效项是什么?我用的是AfterSelect,但似乎不太对劲。也许这实际上是我在找的,但是文档有点模糊。

    4 回复  |  直到 9 年前
        1
  •  34
  •   Pavel Minaev    15 年前

    Winforms TreeView中没有。引用msdn TreeView.AfterSelect :

    取消选择节点时不会发生此事件。要检测此事件,请处理control.mouseup事件并测试treenode.isselected属性。

    是的,这太糟糕了。

        2
  •  9
  •   SLaks    15 年前

    使用没有什么问题 AfterSelect .

    但是,请注意,如果清除选择,则不会触发(如果 SelectedNode 变成 null )相反,你可以处理 MouseUp ,如 documentation .

        3
  •  2
  •   Community VonC    10 年前

    好吧,这是一个很难回答的问题,但这个问题真的让我恼火。 我做了这个小助手类——它对我有用。

    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
    
        4
  •  0
  •   dobragab    9 年前

    Winforms TreeView中没有。为treeview.afterselect引用msdn:

    取消选择节点时不会发生此事件。要检测此事件,请处理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);
        }