【问题标题】:Why isn't there a SelectedNodeChanged event for Windows.Forms.TreeView?为什么 Windows.Forms.TreeView 没有 SelectedNodeChanged 事件?
【发布时间】:2010-12-12 20:54:48
【问题描述】:

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

【问题讨论】:

    标签: c# .net winforms treeview


    【解决方案1】:

    WinForms TreeView 中没有。引用 MSDN 为TreeView.AfterSelect

    取消选择节点时不会发生此事件。要检测这种情况,请处理 Control.MouseUp 事件并测试 TreeNode.IsSelected 属性。

    是的,这很糟糕。

    【讨论】:

    • Control.MouseUp?他们一定是在开玩笑。如果树是用键而不是鼠标导航怎么办?
    • 好吧,这很糟糕,但你总是可以扩展控件并自己添加事件。
    • 如何用键盘取消选择节点?
    • 这仍然会通过选择另一个节点引发AfterSelect 事件。
    • TreeViewSorted 属性设置为True 将取消选择SelectedNode。如果你需要这个,你可以把它放在构造函数中而不是Load事件中,因为它可能会取消选择你已经预先以编程方式选择的节点。
    【解决方案2】:

    使用AfterSelect没有任何问题。

    但是,请注意,如果选择被清除(如果 SelectedNode 变为 null),它不会触发。相反,您可以按照 documentation 中的建议处理 MouseUp

    【讨论】:

    • 不幸的是,当您处理 MouseUp 时,树视图的 SelectedNode 属性尚未更新。
    【解决方案3】:

    好的,这是一个 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
    

    【讨论】:

    • 这可能在 C#... :)
    • @Pedro77 - 如果你想使用它,你也可以翻译它;-)
    【解决方案4】:

    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);
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-04-04
      • 1970-01-01
      • 1970-01-01
      • 2021-05-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-10-13
      相关资源
      最近更新 更多