В данной статье рассмотрено создание методов сохранения и восстановления состояния узлов древовидной структуры элемента управления «TreeView», после обновления данных или изменения состояния узлов.
Создайте проект «Windows Form» в «Microsoft Visual Studio» и добавьте на главную форму вашего проекта следующие элементы управления:
- «TreeView 1»;
- «Button 1» - кнопка сохранения состояния;
- «Button 2» - кнопка загрузки состояния.
Для заполнения элемента управления «TreeView» данными, воспользуемся приведенным ниже листингом. Сделайте двойной клик левой клавишей мыши по любому свободному месту главной формы, вы перейдете в редактор кода с установкой курсора в автоматически созданном методе «Form1_Load», события «Load», выполняющегося при загрузке формы. Вставьте в тело данного метода приведенный ниже листинг.
for (int i = 0; i < 5; i++) { treeView1.Nodes.Add( i.ToString(), "Узел " + i.ToString()); for (int ii = i; ii < 5; ii++) { treeView1.Nodes[i].Nodes.Add( ii.ToString(), "Под узел " + ii.ToString()); } }Перейдите в конструктор главной формы и сделайте двойной клик левой клавишей мыши по элементу управления «button1». Вы перейдете в редактор кода с автоматической установкой курсора в созданном методе «button1_Click», события «Click», возникающего при нажатии на кнопку. Добавьте приведенный ниже листинг, реализующий поиск узлов и сохранения их состояния в словарь, в тело данного метода.
foreach (TreeNode nodeToSave in treeView1.Nodes) { SaveExpandedStates(nodeToSave); }Снова перейдите в конструктор главной формы и проделайте туже операцию с элементом управления «button2», с добавлением приведенного ниже листинга поиска узлов и восстановления их состояния, в тело данного метода.
foreach (TreeNode nodeToRestore in treeView1.Nodes) { RestoreExpandedStates(nodeToRestore); }Для сохранения состояния узла дерева (развернутое/свернутое) будет использоваться словарь (класс Dictionary
Словари имеют динамический характер, расширяясь по мере необходимости.
При сохранении состояния узла дерева и добавлении его в словарь, выполняется проверка существования добавляемого объекта «key» в качестве ключа с использованием метода «ContainsKey()» из класса «DictionaryЕсли ключ «key» уже находится в словаре, то его значение не изменяется, и генерируется исключение «ArgumentException».
При добавлении новой записи в словарь будут передаваться два параметра, в качестве значения ключа «key», будет передается путь из корневого узла дерева к текущему узлу дерева, которое возвращает свойство «TreeNode.FullPath», а значением «value» будет возвращаемое логическое значение свойства «TreeNode.IsExpanded», указывающее, является ли узел дерева в развернутом состоянии. В классе «Dictionaryif (!nodeStates.ContainsKey(nodeToSave.FullPath)) { nodeStates.Add(nodeToSave.FullPath, nodeToSave.IsExpanded); } else { nodeStates[nodeToSave.FullPath] = nodeToSave.IsExpanded; }Добавьте в листинг главной формы код инициализации нового словаря и метода добавления состояния узлов в словарь.
Dictionary<object, bool> nodeStates = new Dictionary<object, bool>(); private void SaveExpandedStates(TreeNode nodeToSave) { if (nodeToSave != null && nodeToSave.FullPath != null) { if (!nodeStates.ContainsKey(nodeToSave.FullPath)) { nodeStates.Add(nodeToSave.FullPath, nodeToSave.IsExpanded); } else { nodeStates[nodeToSave.FullPath] = nodeToSave.IsExpanded; } } foreach (TreeNode childNode in nodeToSave.Nodes) { SaveExpandedStates(childNode); } }При восстановлении состояния узла дерева выполняются две проверки, первая на существования ключа в словаре, переменная узла и значение пути из корневого узла дерева к текущему узлу дерева не пустые. Вторая проверка заключается в получении логического значения хранящегося в словаре, указывающего состояние узла. В зависимости от этого значения, выполняется сворачивание или разворачивание узла дерева. Добавьте приведенный ниже метод восстановления состояния дерева, в листинг главной формы.
private void RestoreExpandedStates(TreeNode nodeToRestore) { if (nodeToRestore != null && nodeToRestore.FullPath != null && nodeStates.ContainsKey(nodeToRestore.FullPath)) { if (nodeStates[nodeToRestore.FullPath]) nodeToRestore.Expand(); else nodeToRestore.Collapse(); } foreach (TreeNode childNode in nodeToRestore.Nodes) { RestoreExpandedStates(childNode); } }Запустите проект, нажав на клавишу «F5». После успешной компиляции и запуска вашего проекта у вас откроется главная форма проекта с заполненным деревом, тестовыми данными. Для проверки работоспособности вашего проекта, разверните несколько узлов и нажмите кнопку «Сохранить», а затем снова измените состояние узлов. Нажмите кнопку «Загрузить», состояние узлов должно вернуться на момент сохранения.
Ссылка для скачивания примера: Яндекс.Диск
Здравствуйте! У меня такая ситуация: на карту нанесены маркеры, но при приближении объекта маркеры не перемещаются, хотя масштаб карты меняется
ОтветитьУдалить