.NET - как из TreeView с произвольной глубиной сформировать таблицу
-
nastr
.NET - как из TreeView с произвольной глубиной сформировать таблицу
Есть TreeView окно, при запуске приложения оно пустое, я набросал код для заполнения parent и child ветвей, глубина может быть произвольной.
Задание: нужно хранить заполненное TreeView в базе данных и при повторном запуске ПО подгружать из БД.
Мое решение: в БД одна таблица, формата {ID, parantID, nodeName}. методы для загрузки и выгрузки в/из БД я написал, наверно представляю как из такой таблицы сформировать TreeView.
Вопрос: как из TreeView с произвольной глубиной (количеством элементов) сформировать таблицу формата {ID, parantID, nodeName}?
Задание: нужно хранить заполненное TreeView в базе данных и при повторном запуске ПО подгружать из БД.
Мое решение: в БД одна таблица, формата {ID, parantID, nodeName}. методы для загрузки и выгрузки в/из БД я написал, наверно представляю как из такой таблицы сформировать TreeView.
Вопрос: как из TreeView с произвольной глубиной (количеством элементов) сформировать таблицу формата {ID, parantID, nodeName}?
-
lxa85
Re: .NET - как из TreeView с произвольной глубиной сформировать таблицу
nastr,
Код:
Во первых мне не нравится вот это условие:
Код:
В каждом вложении отсчет NodeID начинается сначала (с нули или с единицы).
поэтому NodeID = processed; мне не понятна.
Попробуйте для начала просто рекурсивную распечатку директорий сделать. Желательно с трассировкой.
Код:
Код: Выделить всё
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; мне не понятна.
Попробуйте для начала просто рекурсивную распечатку директорий сделать. Желательно с трассировкой.
-
Iska
Re: .NET - как из TreeView с произвольной глубиной сформировать таблицу
я догадался, но реализовать это у меня не получается
Вот решение без рекурсии, но глубина обхода ограничена кодом.
Код:
Вот такой рекурсивный метод, но как еги применить к моей ситуации я пока не представляю.
Код:
Вот решение без рекурсии, но глубина обхода ограничена кодом.
Код:
Код: Выделить всё
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 l = new List();
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 GetAllNodes(TreeNode Node)
{
List list = new List();
list.Add(Node);
foreach (TreeNode n in Node.Nodes)
list.AddRange(GetAllNodes(n));
return list;
}-
lxa85
Re: .NET - как из TreeView с произвольной глубиной сформировать таблицу
nastr, а тут не телепаты, чтобы ваш код знать 

-
nastr
Re: .NET - как из TreeView с произвольной глубиной сформировать таблицу
Следующий код:
Код:
Выводит правильный результат только в случае линейного дерева, т.е.:
/ 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
Код:
Код: Выделить всё
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 l = new List();
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
-
lxa85
Re: .NET - как из TreeView с произвольной глубиной сформировать таблицу
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Кто кому родитель и кто кому ребенок.
Причем желательно в обе стороны, и желательно руками.
Структура -> Дерево.
Дерево -> Структура.
-
nastr
Re: .NET - как из TreeView с произвольной глубиной сформировать таблицу
Вот структура дерева
/ 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
читать дальше »
/ 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
-
nastr
Re: .NET - как из TreeView с произвольной глубиной сформировать таблицу
возможно я изначально, концептуально не верно подошел к решению вопроса, возможно есть какой-то другой способ записать TreeView в БД, и потом загрузить из БД, нежели рекурсивный перебор всех ветвей для формирования таблицы и т.д.
В любом случае всем спасибо за помощь!
В любом случае всем спасибо за помощь!