Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Общие вопросы по .NET и C# > Построение дерева из DataSet'a


Автор: Veitmen 25.8.2007, 05:01
Суть в следующем: Есть ДатаСет в нем одна таблица. Есть ключ в таблице на эту же таблицу. 
Каким образом передать грамотно данные из ДатаСета в TreeView? Дерево получается бесконечным.

СТопарюсь на том что не могу в TreeView получать индекс узлов, к которым надо добавлять поддерево. 

ПОМОГИТЕ! Заранее всем спасибо!)

И выкладываю код в котором я эту всю кашу и делаю.

Код

public Boolean ShowTree(System.Windows.Forms.TreeView Tree)
        {            
            DB.SelectTask(); //Заполняется датасет
            ParentIndex = 0;
            foreach (DataRow RowTask in DB.DataSetTask.Tables["Task"].Rows) //Ищем начала дерева
            {
                TaskID = (int)RowTask["TaskID"];
                FKTask = (int)RowTask["FK_Task"];
                if (TaskID == FKTask)
                {
                    Tree.Nodes.Add(RowTask["Name"].ToString());
                    Parent.Add(TaskID);
                    IndexMax++;
                }
            }
            if (Parent.Count < 1)
            {
                return false;
            }
            Children.Clear();
            Index.Clear();
            ChildIndex = -1;
            for (ParentIndex = 0; ParentIndex < Parent.Count; ParentIndex++)//К каждому узлу на самом верхнем уровне начинаем строить дерево
            {
                ChildrenPrev.Clear();
                IndexPrev.Clear();
                ChildrenPrev.Add((int)Parent[ParentIndex]);
                IndexPrev.Add(ParentIndex);
                FillingTree(Tree);
            }
            return true;
        }

        private void FillingTree(System.Windows.Forms.TreeView Tree)
        {
            Boolean Changed = false;
            Index.Clear();
            Children.Clear();
            /*Index = IndexPrev;
            Children = ChildrenPrev;*/
            for (int i = 0; i < IndexPrev.Count; i++)
            {
                if (DB.SelectTaskByFK((int)ChildrenPrev[i]) == null)//Получаем подузлы к этому узлу
                {
                    IndexPrev.RemoveAt(i);
                    ChildrenPrev.RemoveAt(i);
                    FillingTree(Tree);
                }
                foreach (DataRow RowTask in DB.DataSetTask.Tables["Task"].Rows)
                {
                    if ((int)ChildrenPrev[i] != (int)RowTask["TaskID"])
                    {
                        Changed = true;
                        IndexMax++;
                        Index.Add(IndexMax);                        
                        Children.Add((int)RowTask["TaskID"]);
                        //Tree.Nodes[(int)IndexPrev[i] - 1].Nodes.Add(RowTask["Name"].ToString());
                        Tree.Nodes[(int)IndexPrev[i]].Nodes.Add(RowTask["Name"].ToString()); //Пытаемся добавить к дереву
                        //Tree.Nodes[i].Nodes[].Nodes.Insert((int)IndexPrev[i], RowTask["Name"].ToString());
                    }
                }
            }
            if (Changed) //Если были изменения, поехали опять...
            {
                IndexPrev.Clear();
                CopyArrayTo(Index, IndexPrev);
                ChildrenPrev.Clear();
                CopyArrayTo(Children, ChildrenPrev);                
                FillingTree(Tree);
            }
        }


CopyArrayTo это моя функция...

Автор: Veitmen 25.8.2007, 05:26
Я бы даже сказал что весь вопрос в том как правильно к TreeView обртиться. Алгоритм мне понятен.

Автор: archeg 25.8.2007, 13:28
Не знаю правильно ли я понял проблему:
В свойство Tag каждого узла забивай Id-шник узла в DataSet`e. Потом если нужно присоединить новый узел к существующему - ищешь среди узлов TreeView узел с соотв. Tag-ом

Автор: Veitmen 25.8.2007, 13:43
Хм... Начинаю пробовать. Я думаю правильно понял.)

Добавлено через 7 минут и 59 секунд
Сразу вопрос! У TreeView есть встроенный поиск по тагу??

Автор: archeg 25.8.2007, 13:53
Цитата(Veitmen @  25.8.2007,  13:43 Найти цитируемый пост)
Сразу вопрос! У TreeView есть встроенный поиск по тагу?? 

Нет, не встречал smile 

Таг вообще не часто используется. Кстати туда можно всунуть какую-то структуру, например с Id, именем и еще чем-то - для удобства

Автор: Veitmen 25.8.2007, 14:36
Нашел что у TreeView есть прикол под названием Key... Не знал. 

Вот код...


Код

 public void ShowTree(System.Windows.Forms.TreeView Tree)
        {
            DB.SelectTask();  //Берем данные          
            DataRow[] WorkData = DB.DataSetTask.Tables["Task"].Select("TaskID = FK_Task");//Находим узлы
            foreach (DataRow RowTask in WorkData)
            {
                Parent.Clear();
                Tree.Nodes.Add(RowTask["TaskID"].ToString(), RowTask["Name"].ToString());//Добавляем
                Parent.Add(RowTask["TaskID"].ToString());//Запоминаем с кем работаем, надо для рекурсии
                FillingTree(Tree);//Поехали...
            }
        }

        private void FillingTree(System.Windows.Forms.TreeView Tree)
        {
            Child.Clear();
            Boolean Changed = false;
            System.Windows.Forms.TreeNode[] FindNode;
            for (int I = 0; I < Parent.Count; I++)
            {
                FindNode = Tree.Nodes.Find(Parent[I].ToString(),true);//Находим нод по ключу
                DataRow[] WorkData = DB.DataSetTask.Tables["Task"].Select("FK_Task = " + 
                    Parent[I].ToString() + " and TaskID <> FK_Task");//Находим наследников
                foreach (DataRow RowTask in WorkData)
                {
                    FindNode[0].Nodes.Add(RowTask["TaskID"].ToString(), RowTask["Name"].ToString());//Заполняем
                    Child.Add(RowTask["TaskID"].ToString());//Запоминаем наследников
                    Changed = true;
                }
            }
            if (Changed)//Если дерево менялось, значит есть наследники
            {
                Parent.Clear();   //Здесь и далее делаем наследников родителями и вызываем функцию еще раз
                CopyArrayTo(Child, Parent);
                Child.Clear();
                FillingTree(Tree);
            }
        }

Автор: jonie 25.8.2007, 23:39
стоит почитать : http://www.realcoding.net/article/view/2691

Автор: Veitmen 26.8.2007, 18:04
Короче тут все решили.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)