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