Vb.net保存TreeView中展开的节点



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

以下是一些指导实现的基本思想:

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

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

请注意,这段代码并不能简单地通过将其放入应用程序来保证其工作。

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

希望这能让你开始。

最新更新