Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.58/64: Рейтинг темы: голосов - 64, средняя оценка - 4.58
 Аватар для kapriz0n
20 / 20 / 0
Регистрация: 26.10.2008
Сообщений: 77

Сохранение TreeView списка

22.01.2010, 03:23. Показов 12209. Ответов 7
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Вопрос таков, кто сталкивался может кто знает как не в ручную можно сохранить TreeNode из TreeView, так чтобы можно было потом востановить это дерево.. Есть ли возможность работы чем то готовым с Xml? Неужели нужно рекурсивно все засовывать вручную? Скажем пример реализации подобного как у Opera браузера в отделе Закладки. Может можно как то ссериализовать? Кто сталкивался помогите пожалуйста..
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
22.01.2010, 03:23
Ответы с готовыми решениями:

Сохранение и обращения к нодам в компоненте TreeView
1. Кто нить может подсказать как сохранять ноды дерева в текстовый файл и как потом можно прочесть из него? Просто в С++ есть конкретная...

Вывод списка таблиц в treeview
Не работал с treeview поэтому не могу понять, что не так делаю Цель вывести в treeview список таблиц из SQLite private void...

Как присвоить серверному контроллу TreeView коллекцию из TreeView, в котором находится информация из БД
Здравствуйте, в общем я кидаю на страницу TreeView и хочу его динамически заполнять, но сразу куча проблем, обо всем по порядку: ...

7
118 / 119 / 20
Регистрация: 21.01.2010
Сообщений: 252
22.01.2010, 13:41
Лучший ответ Сообщение было отмечено как решение

Решение

Ну если я правильно понял суть вопроса, то можно примерно так:

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
// здесь сохраняем юзая XML сериализатор
private void button1_Click(object sender, EventArgs e)
        {
            FileStream fs = new FileStream("TreeSave.xml", FileMode.Create);
            SoapFormatter sf = new SoapFormatter();
            sf.Serialize(fs, treeView1.Nodes[0]); // сериализация корневого узла
            fs.Close();
            treeView1.Nodes.Clear(); // очистка дерева для наглядности
        }
 
// Здесь загружаем 
private void button2_Click(object sender, EventArgs e)
        {
            FileStream fs = new FileStream("TreeSave.xml", FileMode.Open);
            SoapFormatter sf = new SoapFormatter();
            treeView1.Nodes.Add((TreeNode)sf.Deserialize(fs));
            fs.Close();
        }
также нужно добавить ссылку в проект на дллэшку System.Runtime.Serialization.Formatters. Soap и ссылку using System.Runtime.Serialization.Formatters. Soap. У меня всё работало.
4
 Аватар для kapriz0n
20 / 20 / 0
Регистрация: 26.10.2008
Сообщений: 77
22.01.2010, 20:32  [ТС]
Цитата Сообщение от _Art_ Посмотреть сообщение
Ну если я правильно понял суть вопроса, то можно примерно так:

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
// здесь сохраняем юзая XML сериализатор
private void button1_Click(object sender, EventArgs e)
        {
            FileStream fs = new FileStream("TreeSave.xml", FileMode.Create);
            SoapFormatter sf = new SoapFormatter();
            sf.Serialize(fs, treeView1.Nodes[0]); // сериализация корневого узла
            fs.Close();
            treeView1.Nodes.Clear(); // очистка дерева для наглядности
        }
 
// Здесь загружаем 
private void button2_Click(object sender, EventArgs e)
        {
            FileStream fs = new FileStream("TreeSave.xml", FileMode.Open);
            SoapFormatter sf = new SoapFormatter();
            treeView1.Nodes.Add((TreeNode)sf.Deserialize(fs));
            fs.Close();
        }
также нужно добавить ссылку в проект на дллэшку System.Runtime.Serialization.Formatters. Soap и ссылку using System.Runtime.Serialization.Formatters. Soap. У меня всё работало.
Все вообщем то верно за исключением непонятного момента если у меня несколько родителей то пробовал провести ссериализацию так
C#
1
2
for (int i = 0; i < this.treeView.Nodes.Count;i++ )
            sf.Serialize(fs,(Object) this.treeView.Nodes[i]); // сериализация корневого узла
Но увы не получилось. И плюс сама сложность у меня заключается в том что у меня есть распределение там есть файлы по расширению меняют отображение и простые папки. Пройти рекурсивно не сложно по всему этому дереву но как сохранить структурой данных ума не приложу.. За исключением опять таки чисто ручной сборки и вставки. Может есть какие то идеи?
0
118 / 119 / 20
Регистрация: 21.01.2010
Сообщений: 252
23.01.2010, 07:45
Если корневых узлов много то можно так:

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
// сохраняем
private void button1_Click(object sender, EventArgs e)
        {
//массив временый который и будем сериализовать
            TreeNode[] tempNodes = new TreeNode[treeView1.Nodes.Count];
// заполняем его
            for (int i = 0; i < treeView1.Nodes.Count; i++) 
                tempNodes[i] = treeView1.Nodes[i];
// сама сериализация
            FileStream fs = new FileStream("TreeSave.xml", FileMode.Create);
            SoapFormatter sf = new SoapFormatter();
            sf.Serialize(fs, tempNodes);
            fs.Close();
            treeView1.Nodes.Clear(); // очищаем для наглядности
        }
// а здесь загружаем
        private void button2_Click(object sender, EventArgs e)
        {
            TreeNode[] tempNodes;
            FileStream fs = new FileStream("TreeSave.xml", FileMode.Open);
            SoapFormatter sf = new SoapFormatter();
            tempNodes = (TreeNode[])sf.Deserialize(fs);
            treeView1.Nodes.AddRange(tempNodes);
            fs.Close();
        }
У меня все работало. Вся структура узлов сохранена и корневых и вложеных.
Просто сериализовать коллекцию TreeNodes нельзя ибо не помечена как сериализуемая.
5
 Аватар для kapriz0n
20 / 20 / 0
Регистрация: 26.10.2008
Сообщений: 77
23.01.2010, 07:54  [ТС]
Все то верно. Спасибо огромное. Но все же как же мне реализовать разделение что бы сохранились данные Tag, Image, Name, каждого TreeNode? Странно что такой элемент и нет ничего чтобы было возможно сохранение как данные.
0
0 / 0 / 1
Регистрация: 12.03.2010
Сообщений: 6
23.03.2010, 17:20
и всплывет еще одна проблема
Tag у TreeNode имеет значение экземпляра класса унаследованного от System.IO.Port.SerialPort, который не помечен как сериализуемый
что делать не знаю
(а корень можно сделать один, первый пример работает и все сохраняет даже Tag, по этому и ругается)
0
VovikDoc
05.08.2010, 00:59
А нельзя ли как-нибудь поработать с потоком? те засунуть в него же ещё одно Дерево, КомбоБох, совсем точнее: записать инфу в уже существующий ХМЛ, в виде элемента
Заранее благодарю ВС
21 / 21 / 3
Регистрация: 24.07.2010
Сообщений: 161
05.08.2010, 01:17
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
using System;
using System.Windows.Forms;
using System.Xml;
 
public class XmlTreeDisplay : System.Windows.Forms.Form{
    private System.Windows.Forms.TreeView treeXml = new TreeView();
 
    public XmlTreeDisplay() {
        treeXml.Nodes.Clear();
        this.Controls.Add(treeXml);
        // Load the XML Document
        XmlDocument doc = new XmlDocument();
        try {
            doc.Load("books.xml");
        }catch (Exception err) {
 
            MessageBox.Show(err.Message);
            return;
        }
 
        ConvertXmlNodeToTreeNode(doc, treeXml.Nodes);
        treeXml.Nodes[0].ExpandAll();
    }
 
    private void ConvertXmlNodeToTreeNode(XmlNode xmlNode, 
      TreeNodeCollection treeNodes) {
 
        TreeNode newTreeNode = treeNodes.Add(xmlNode.Name);
 
        switch (xmlNode.NodeType) {
            case XmlNodeType.ProcessingInstruction:
            case XmlNodeType.XmlDeclaration:
                newTreeNode.Text = "<?" + xmlNode.Name + " " + 
                  xmlNode.Value + "?>";
                break;
            case XmlNodeType.Element:
                newTreeNode.Text = "<" + xmlNode.Name + ">";
                break;
            case XmlNodeType.Attribute:
                newTreeNode.Text = "ATTRIBUTE: " + xmlNode.Name;
                break;
            case XmlNodeType.Text:
            case XmlNodeType.CDATA:
                newTreeNode.Text = xmlNode.Value;
                break;
            case XmlNodeType.Comment:
                newTreeNode.Text = "<!--" + xmlNode.Value + "-->";
                break;
        }
 
        if (xmlNode.Attributes != null) {
            foreach (XmlAttribute attribute in xmlNode.Attributes) {
                ConvertXmlNodeToTreeNode(attribute, newTreeNode.Nodes);
            }
        }
        foreach (XmlNode childNode in xmlNode.ChildNodes) {
            ConvertXmlNodeToTreeNode(childNode, newTreeNode.Nodes);
        }
    }
    public static void Main(){
       Application.Run(new XmlTreeDisplay());
    }
}
/*
<books>
  <A property="a">
    <B>text</B>
    <C>textg</C>
    <D>99999</D>
  </A>
</books>
*/
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
05.08.2010, 01:17
Помогаю со студенческими работами здесь

Сохранение/загрузка TreeView
Всем привет. Возникла следующая проблема. Имею дерево: public static TreeView TV; // System.Windows.Controls.TreeView ...

Сохранение и валидация TreeView с чекбоксами
Есть база данных. Из неё создаю некую структуру и пихаю всё в TreeView. (Картинка 1) Иерархическая структура создаётся на основе...

TreeView HierarchicalDataTemplate из простого списка
Всем привет. Что-то не могу найти решения на простой вопрос (на более сложные варианты есть примеры) Есть у меня список...

TreeView подгрузка списка по требованию
Где то видел подобную тему 3 месяца назад а сейчас найти не могу когда понадобилась.(подрозумивается чтобы грузился первый ряд а после...

Получение списка видимых элементов из TreeView
Существует некий TreeView с привязанными элементами. Возможно ли получить список элементов из данной коллекции, видимых пользователю? Если...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru