Я создаю форму в VB.net, содержащую TreeView. Этот TreeView заполняется расширяемыми родительскими узлами и соответствующими дочерними узлами. Когда пользователь запускает программу, он может расширять любые узлы по своему желанию. Есть ли способ программно сохранить, какие узлы были расширены, чтобы при следующей загрузке формы эти узлы оставались развернутыми? Мне не обязательно нужны закодированные примеры (хотя они могут быть полезны), просто общее представление о командах/элементах управления/логике для использования в программе. Заранее спасибо!
Vb.net Сохранить, какие узлы были развернуты в TreeView
Ответы (1)
Вот несколько основных идей, которые помогут вам в реализации:
Создайте список, чтобы отслеживать узлы, которые в настоящее время развернуты:
Private _ExpandedNodeList As New List(Of String)
Настройте два обработчика событий для отслеживания событий AfterCollapse и AfterExpand TreeView — они происходят, когда пользователь открывает/закрывает разные части дерева. Хитрость здесь в том, что обработчики событий просто добавляют и удаляют значение тега узла, которое представляет собой некоторую строку, которую вы установили для узла при построении дерева.
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
Обратите внимание, что этот код не гарантирует работу, если просто добавить его в приложение.
По крайней мере, вам нужно тщательно подумать о построении вашего дерева и о том, устанавливаете ли вы значение тега для каждого узла дерева.
Надеюсь, это поможет вам начать.
ExpandedNodesList
, будет ли он сохранен и будет доступен при следующем запуске приложения пользователем?
- person Aidan Kehoe; 25.05.2016
I don't necessarily need coded examples (although they can be useful), just a general idea of the commands/controls/logic to use in the program
Имея это в виду, достаточно небольшого комментария, так как это даст ему пищу для размышлений.
- person zaggler; 25.05.2016
I figured it would have to be written to a text file
Я упомянул об этом в своем комментарии выше, почему вы не задали больше вопросов, это было недостаточно полезно, с чего начать?
- person zaggler; 25.05.2016
Is there a way to programmatically save which nodes were expanded so that next time the form is loaded, those nodes remain expanded?
Кажется, он спросил об этом. Вы упомянули there's no talk about closing the application, serializing settings, restarting the application, restoring settings from file etc
, я просто не согласен с тем, что он явно это сделал.
- person zaggler; 25.05.2016
MySettings
, сохраните в файл, используя двоичный форматтер, базу данных, это зависит от вас, как вы хотите сохранить эти данные и получить их обратно. - person zaggler   schedule 25.05.2016