Vb.net 保存在 TreeView 中展开了哪些节点

Vb.net Save which nodes were expanded in TreeView

我正在 VB.net 中创建一个包含 TreeView 的表单。此 TreeView 填充有可展开的父节点和相应的子节点。当用户运行程序时,他们可以展开他们想要的任何节点。有没有办法以编程方式保存展开了哪些节点,以便下次加载表单时,这些节点保持展开状态?我不一定需要编码示例(尽管它们可能很有用),只是要在程序中使用的 commands/controls/logic 的一般概念。提前致谢!

以下是指导您实施的一些基本想法:

创建一个列表来跟踪当前展开的节点:

Private _ExpandedNodeList As New List(Of String)

设置两个事件处理程序来跟踪 TreeView 的 AfterCollapse 和 AfterExpand 事件 - 这些事件在用户打开/关闭树的不同部分时发生。这里的技巧是事件处理程序只是添加和删除节点的标记值,这是您在构建树时在节点上设置的一些字符串。

Private Sub TreeView_AfterCollapse(sender As Object, e As TreeViewEventArgs) Handles TreeView.AfterCollapse
    If _ExpandedNodeList.Contains(e.Node.Tag.ToString) Then
        _ExpandedNodeList.Remove(e.Node.Tag.ToString)
    End If
End Sub
Private Sub TreeView_AfterExpand(sender As Object, e As TreeViewEventArgs) Handles TreeView.AfterExpand
    If Not _ExpandedNodeList.Contains(e.Node.Tag.ToString) Then
        _ExpandedNodeList.Add(e.Node.Tag.ToString)
    End If
End Sub

现在,假设您在应用程序中有一个点需要将 TreeView 恢复到特定状态。您可以递归 TreeView 中的节点并对列表中的节点调用 Expand。

我的实现是这样的:

Private Sub ShowVisibleNodes()
    Dim Node As TreeNode

    For Each ExpandedChildNodeName As String In _ExpandedNodeList
        For Each RootNode As TreeNode In TreeView.Nodes
            Node = NodeFromTagName(ExpandedChildNodeName, RootNode)
            If Node IsNot Nothing Then
                Node.Expand()
            End If
        Next
    Next

End Sub
Private Function NodeFromTagName(ByVal NodeTagName As String, NodeToSearch As TreeNode) As TreeNode
    Dim NextNode As TreeNode

    'check input node
    If NodeToSearch.Tag IsNot Nothing Then
        If NodeToSearch.Tag.Equals(NodeTagName) Then
            Return NodeToSearch
        End If
    End If

    'check child nodes and recurse on intermediary nodes
    For Each Node As TreeNode In NodeToSearch.Nodes
        If Node.Tag IsNot Nothing Then
            If Node.Tag.Equals(NodeTagName) Then
                Return Node
            End If
            NextNode = NodeFromTagName(NodeTagName, Node)
            If NextNode IsNot Nothing Then
                Return NextNode
            End If
        End If
    Next

    Return Nothing

End Function

请注意,仅将此代码放入您的应用程序并不能保证其正常工作。

至少,您需要仔细考虑构建树以及是否为每个 TreeNode 的 Tag 设置值。

希望这能帮助您入门。