Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » .NET - как из TreeView с произвольной глубиной сформировать таблицу

Ответить
Настройки темы
.NET - как из TreeView с произвольной глубиной сформировать таблицу

Новый участник


Сообщения: 16
Благодарности: 0

Профиль | Отправить PM | Цитировать


Есть TreeView окно, при запуске приложения оно пустое, я набросал код для заполнения parent и child ветвей, глубина может быть произвольной.
Задание: нужно хранить заполненное TreeView в базе данных и при повторном запуске ПО подгружать из БД.
Мое решение: в БД одна таблица, формата {ID, parantID, nodeName}. методы для загрузки и выгрузки в/из БД я написал, наверно представляю как из такой таблицы сформировать TreeView.
Вопрос: как из TreeView с произвольной глубиной (количеством элементов) сформировать таблицу формата {ID, parantID, nodeName}?

Отправлено: 14:13, 19-12-2013

 

Аватара для lxa85

Необычный


Contributor


Сообщения: 4463
Благодарности: 994

Профиль | Сайт | Отправить PM | Цитировать


nastr,
Код: Выделить весь код
private void saveTreeNode(TreeNodeCollection nodes, int NoteID, ref int processed, ref bool root)
        {
            foreach (TreeNode node in nodes)
            {
                int ParentNoteID;
                if (root)
                {
                    ParentNoteID = -1;
                    root = false;
                }
                else
                    ParentNoteID = NoteID - 1;
                l.Add(new Trees(NoteID, ParentNoteID, node.Text));
                ++processed;
                saveTreeNode(node.Nodes, NoteID + 1, ref processed, ref root);
                root = true;
                NoteID = processed;
            }
        }
Во первых мне не нравится вот это условие:
Код: Выделить весь код
                int ParentNoteID;
                if (root) {
                    ParentNoteID = -1;
                    root = false;  }
                else  ParentNoteID = NoteID - 1;
....
                root = true;
                NoteID = processed;
В каждом вложении отсчет NodeID начинается сначала (с нули или с единицы).
поэтому NodeID = processed; мне не понятна.

Попробуйте для начала просто рекурсивную распечатку директорий сделать. Желательно с трассировкой.

-------
- Я не разрешаю тебе быть плохой! Потому что плохие люди совершают плохие поступки. А это нехорошо!
(Из наставлений 5 летней девочки своей младшей сестре)

Это сообщение посчитали полезным следующие участники:

Отправлено: 16:43, 20-12-2013 | #11



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Новый участник


Сообщения: 16
Благодарности: 0

Профиль | Отправить PM | Цитировать


Цитата lxa85:
В каждом вложении отсчет NodeID начинается сначала (с нули или с единицы).
поэтому NodeID = processed; мне не понятна.
Попробуйте для начала просто рекурсивную распечатку директорий сделать. Желательно с трассировкой. »
processed это ссылочная переменная, для того что бы В каждом вложении отсчет NodeID начинается не сначала, а продолжался с учётом предыдущего.

Отправлено: 22:15, 20-12-2013 | #12


Аватара для lxa85

Необычный


Contributor


Сообщения: 4463
Благодарности: 994

Профиль | Сайт | Отправить PM | Цитировать


nastr,
Цитата nastr:
processed это ссылочная переменная, для того что бы В каждом вложении отсчет NodeID начинается не сначала, а продолжался с учётом предыдущего. »
Зачем?
Это вызывает путаницу и лишнее усложнение кода, как для проверки, так и для понимания.
NodeID - должная вообще генерироваться автоматически, в процедуре записи дерева.
----
Шаг назад.
Процедура рекурсивного обхода дерева, и процедура записи дерева в линейную структуру -- это две отдельные процедуры!
Причем NodeID, как ключевое(уникальное) значение таблицы, должен считаться в процедуре записи

-------
- Я не разрешаю тебе быть плохой! Потому что плохие люди совершают плохие поступки. А это нехорошо!
(Из наставлений 5 летней девочки своей младшей сестре)


Отправлено: 11:56, 21-12-2013 | #13


Новый участник


Сообщения: 16
Благодарности: 0

Профиль | Отправить PM | Цитировать


The main question how to fully traverse/circumvent through all TreeView, for transforming Tree structure into a Table structure.
I want to note that the TreeView may contain a different number of branches, with different depths and different names.
I found a lot of information how to populate TreeView e.g. from DataTable, but I didn’t found information how to recursively traverse/circumvent a TreeView and populate/fill data e.g. to DataTable.

As sample I have following TreeView:
Aaron
-Baldwin
--Caleb
---Dale
--Earl
-Fabian
Gabriel
-Harold
-Ian

Necessary to convert the TreeView into e.g. DataTable:
id | Name | ParentId
--------------------------------
1 | Aaron | null
2 | Baldwin | 1
3 | Caleb | 2
4 | Dale | 3
5 | Earl | 2
6 | Fabian | 1
7 | Gabriel | null
8 | Harold | 7
9 | Ian | 7

Отправлено: 21:34, 08-02-2014 | #14


Новый участник


Сообщения: 16
Благодарности: 0

Профиль | Отправить PM | Цитировать


First of all i want tot thank you for your help, but similar code i already wrote by myself. Following code is work well:
Код: Выделить весь код
        private void buttonSave_Click(object sender, EventArgs e)
        {
            TraverseTreeView(treeView1);
            string temp = String.Empty;
            foreach (string str in name)
                temp += str + Environment.NewLine;
            MessageBox.Show(temp);
            name.Clear();
        }
        List<string> name = new List<string>();
        private void TraverseTreeView(TreeView tview)
        {
            TreeNode temp = new TreeNode();
            for (int k = 0; k < tview.Nodes.Count; k++)
            {
                temp = tview.Nodes[k];
                name.Add(k+"\t"+temp.Text+"\tnull");
                for (int i = 0; i < temp.Nodes.Count; i++)
                    visitChildNodes(temp.Nodes[i]);
            } 
        }
        private void visitChildNodes(TreeNode node)
        {
            name.Add(node.Text);
            for (int j = 0; j < node.Nodes.Count; j++)
                visitChildNodes(node.Nodes[j]);
        }
But there is still several things that I don't know how to realize:
1. Do not use global variable (List<string> name) for collecting result;
2. Correctly collect data perhaps in DataTable, in format "1 | Aaron | null".
Please chech code below, and fix mistaks:
Код: Выделить весь код
private void buttonSave_Click(object sender, EventArgs e)
        {
            DataTable dt = new DataTable();
            dt = TraverseTreeView(treeView1);
            string temp = String.Empty;
            foreach (string str in dt)
                temp += str + Environment.NewLine;
            MessageBox.Show(temp);
            dt.Clear();
        }
        //List<string> name = new List<string>();
        private DataTable TraverseTreeView(TreeView tview)
        {
            DataTable dt = new DataTable();
            dt.Columns.Add("id", typeof(int));
            dt.Columns.Add("Name");
            dt.Columns.Add("ParentId", typeof(int));
            TreeNode temp = new TreeNode();
            for (int k = 0; k < tview.Nodes.Count; k++)
            {
                temp = tview.Nodes[k];
                dt.Rows.Add(k, temp.Text, null);
                //name.Add(temp.Text);
                for (int i = 0; i < temp.Nodes.Counst; i++)
                    dt.Rows.Add(i, visitChildNodes(temp.Nodes[i]).Text, i - 1);
            }
            return dt;
        }
        private DataTable visitChildNodes(TreeNode node)
        {
            //name.Add(node.Text);
            DataTable dt = new DataTable();
            dt.Columns.Add("id", typeof(int));
            dt.Columns.Add("Name");
            dt.Columns.Add("ParentId", typeof(int));
            for(int j = 0; j < node.Nodes.Count; j++)
                dt.Rows.Add(j, visitChildNodes(node.Nodes[j]).Text, j - 1);
            return dt;
        }

Отправлено: 00:12, 12-02-2014 | #15



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » .NET - как из TreeView с произвольной глубиной сформировать таблицу

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
Сделать таблицу с линиями из текста enikei Хочу все знать 3 17-11-2010 16:40
[решено] из файла Word получаем сразу таблицу в HTML... serj88rus Вебмастеру 2 05-07-2010 12:09
Выборочная загрузка и выгрузка данных из формы в таблицу MySQL dima1981 Вебмастеру 8 25-08-2008 18:02
[решено] загрузка данных из html форм в таблицу баз mysql dima1981 Вебмастеру 5 16-08-2008 01:34




 
Переход