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

Компьютерный форум 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

 

Ветеран


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

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


Рекурсивно.

Отправлено: 14:21, 19-12-2013 | #2



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

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


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


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

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


я догадался, но реализовать это у меня не получается

Вот решение без рекурсии, но глубина обхода ограничена кодом.
Код: Выделить весь код
public class Trees
    {
        public Trees()
        {
        }
        public Trees(int NoteID, int ParentNoteID, string NoteName)
        {
            this.NoteID = NoteID;
            this.ParentNoteID = ParentNoteID;
	    this.NoteName = NoteName;
        }
        public int NoteID { get; private set; }
        public string NoteName { get; private set; }
        public int ParentNoteID { get; private set; }
    }
private void treeNode()
{
	List<Trees> l = new List<Trees>();
	foreach (TreeNode childChildNode in treeView1.Nodes)
	{
		l.Add(new Trees(1, 0, treeNode.Text));
		foreach (TreeNode childChildNode in treeNode.Nodes)
            	{
                	l.Add(new Trees(2, 1, treeNode.Text));
	                foreach (TreeNode c in childChildNode.Nodes)
	                {
	                    l.Add(new Trees(3, 2, treeNode.Text));
			    //и так далее для обхода в глубину, а глубина должна быть произвольной
	                }
            	}
        }
}
Вот такой рекурсивный метод, но как еги применить к моей ситуации я пока не представляю.
Код: Выделить весь код
private List<TreeNode> GetAllNodes(TreeNode Node)
        {
            
            List<TreeNode> list = new List<TreeNode>();
            list.Add(Node);
            foreach (TreeNode n in Node.Nodes)
                list.AddRange(GetAllNodes(n));
            return list;
        }

Последний раз редактировалось Drongo, 19-12-2013 в 20:49.


Отправлено: 14:28, 19-12-2013 | #3


Аватара для lxa85

Необычный


Contributor


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

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


nastr, а тут не телепаты, чтобы ваш код знать

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


Отправлено: 14:44, 19-12-2013 | #4


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


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

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


...

Последний раз редактировалось nastr, 19-12-2013 в 23:31.


Отправлено: 20:34, 19-12-2013 | #5


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


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

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


Следующий код:
Код: Выделить весь код
    public class Trees
    {
        public Trees()
        {
        }
        public Trees(int NoteID, int ParentNoteID, string NoteName)
        {
            this.NoteID = NoteID;
            this.ParentNoteID = ParentNoteID;
            this.NoteName = NoteName;
        }
        public int NoteID { get; private set; }
        public int ParentNoteID { get; private set; }
        public string NoteName { get; private set; }
    }
        private void saveButton_Click(object sender, EventArgs e)
        {
            int processed = 0;
            bool root = true;
            saveTreeNode(treeView1.Nodes, 0, ref processed, ref root);
            string str = String.Empty;
            foreach (Trees t in l)
                str += "\t" + t.NoteID + "\t" + t.ParentNoteID + "\t" + t.NoteName + Environment.NewLine;
            MessageBox.Show(str);
            str = String.Empty;
            l.Clear();
        }
        List<Trees> l = new List<Trees>();
        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;
            }
        }
Выводит правильный результат только в случае линейного дерева, т.е.:
читать дальше »

/ 0 -1 parent
- 1 0 child
-- 2 1 child
-- 3 2 child
--- 4 3 child
/ 5 -1 parent
- 6 5 child
-- 7 6 child
--- 8 7 child

Но в случае не линейного дерева получается совсем не то что хотелось бы:
читать дальше »

/ 0 -1 parent
- 1 0 child
--2 1 child
--3 -1 child
- 4 -1 child
- 5 -1 child
/ 6 -1 parent
- 7 6 child
- 8 -1 child
- 9 -1 child

Последний раз редактировалось nastr, 19-12-2013 в 23:30. Причина: опечатка


Отправлено: 23:29, 19-12-2013 | #6


Аватара для lxa85

Необычный


Contributor


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

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


nastr, Насколько я понимаю древовидное описание, на основе {ID, parentID, NodeName}, не в первом, не во втором случае ответ не правильный.
Попробовал вчитаться в процедуру -- не понял.

Напишите на примере

Код: Выделить весь код
Alpha
    Bravo	
    Charlie
    Delta	
        Echo
        Foxtrot
            Golf
                Hotel	
    India
        Juliet
    Kilo	
    Lima
Mike
    November
        Oscar
            Papa
        Quebec
            Romeo
        Sierra
        Tango
            Uniform
                Victor
            Whiskey
    X-ray
    Yankee
    Zulu

Кто кому родитель и кто кому ребенок.
Причем желательно в обе стороны, и желательно руками.
Структура -> Дерево.
Дерево -> Структура.

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


Отправлено: 09:18, 20-12-2013 | #7


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


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

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


Вот структура дерева
читать дальше »

/ 0 -1 parent
- 1 0 child
-- 2 1 child
-- 3 2 child
---4 3 child
/ 5 -1 parent
- 6 5 child
-- 7 6 child
---8 7 child

Equal to:

Alpha
-Bravo
--Charlie
---Delta
Mike
-November
--Oscar
---Papa
;
/ 0 -1 parent
- 1 0 child
--2 1 child
--3 -1 child
- 4 -1 child
- 5 -1 child
/ 6 -1 parent
- 7 6 child
- 8 -1 child
- 9 -1 child

Equal to:

Alpha
-Bravo
--Charlie
--Delta
-Echo
-Foxtrot
Mike
-November
-Oscar
-Whiskey

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


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


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

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


возможно я изначально, концептуально не верно подошел к решению вопроса, возможно есть какой-то другой способ записать TreeView в БД, и потом загрузить из БД, нежели рекурсивный перебор всех ветвей для формирования таблицы и т.д.
В любом случае всем спасибо за помощь!

Отправлено: 13:50, 20-12-2013 | #9

pva pva вне форума

Аватара для pva

Ветеран


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

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


nastr, используй глобальный счётчик для создания новой ветки, сделай что-то вроде рекурсивного перебора всех веток
Так бы оно могло выглядеть на js:
Код: Выделить весь код
var __id=0;
function genId() { return ++__id; }

function walk(root_id, root, text) {
  var kid_id=genId();
  WScript.Echo("INSERT INTO TAB1 (PARENT_ID, ID, TEXT) VALUES("+root_id+", "+kid_id+", '"+text+"');");
  for(var i in root) { walk(kid_id, root[i], i); }
}

data={
   floor1:{John:true, Marie:true},
   floor2:{maniac:true},
   floor3:{doctor:true, policeman:true}
};

walk("NULL", data, "thriller-house");

Последний раз редактировалось pva, 20-12-2013 в 16:27.


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



Компьютерный форум 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




 
Переход