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

Аватара пользователя
nastr

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

Сообщение nastr »

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

Задание: нужно хранить заполненное TreeView в базе данных и при повторном запуске ПО подгружать из БД.

Мое решение: в БД одна таблица, формата {ID, parantID, nodeName}. методы для загрузки и выгрузки в/из БД я написал, наверно представляю как из такой таблицы сформировать TreeView.

Вопрос: как из TreeView с произвольной глубиной (количеством элементов) сформировать таблицу формата {ID, parantID, nodeName}?
Аватара пользователя
lxa85

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

Сообщение lxa85 »

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; мне не понятна.



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

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

Сообщение Iska »

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



Вот решение без рекурсии, но глубина обхода ограничена кодом.



Код:

Код: Выделить всё

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;
        }
Аватара пользователя
nastr

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

Сообщение nastr »

Следующий код:



Код:

Код: Выделить всё

    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 с произвольной глубиной сформировать таблицу

Сообщение lxa85 »

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 с произвольной глубиной сформировать таблицу

Сообщение nastr »

Вот структура дерева


читать дальше »




/ 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 с произвольной глубиной сформировать таблицу

Сообщение nastr »

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

В любом случае всем спасибо за помощь!
Ответить

Вернуться в «Программирование и базы данных»