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 设置值。
希望这能帮助您入门。
我正在 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 设置值。
希望这能帮助您入门。