Vb.net保存在TreeView中扩展的节点

时间:2016-05-25 10:22:49

标签: vb.net treeview nodes expand

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

1 个答案:

答案 0 :(得分:1)

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

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

Private _ExpandedNodeList As New List(Of String)

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

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上设置值。

希望这会让你开始。