Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Построение дерева из DataSet'a 
V
    Опции темы
Veitmen
Дата 25.8.2007, 05:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 288
Регистрация: 10.11.2006
Где: СПБ

Репутация: 3
Всего: 4



Суть в следующем: Есть ДатаСет в нем одна таблица. Есть ключ в таблице на эту же таблицу. 
Каким образом передать грамотно данные из ДатаСета в 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:30
PM MAIL ICQ   Вверх
Veitmen
Дата 25.8.2007, 05:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 288
Регистрация: 10.11.2006
Где: СПБ

Репутация: 3
Всего: 4



Я бы даже сказал что весь вопрос в том как правильно к TreeView обртиться. Алгоритм мне понятен.
PM MAIL ICQ   Вверх
archeg
Дата 25.8.2007, 13:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 612
Регистрация: 6.1.2007
Где: Киев

Репутация: 11
Всего: 27



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

Это сообщение отредактировал(а) archeg - 25.8.2007, 13:28


--------------------
ИМХО задница есть универсальный интерфейс. Ибо через задницу можно сделать абсолютно ВСЕ (bash.org.ru)

Дядька всегда можно спросить в аське, если не задалбывать - не откажет smile
И вообще, на самом деле я студент, и ненавижу обращение на "Вы") Тут все свои  ;)
PM MAIL ICQ Jabber   Вверх
Veitmen
Дата 25.8.2007, 13:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 288
Регистрация: 10.11.2006
Где: СПБ

Репутация: 3
Всего: 4



Хм... Начинаю пробовать. Я думаю правильно понял.)

Добавлено через 7 минут и 59 секунд
Сразу вопрос! У TreeView есть встроенный поиск по тагу??
PM MAIL ICQ   Вверх
archeg
Дата 25.8.2007, 13:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 612
Регистрация: 6.1.2007
Где: Киев

Репутация: 11
Всего: 27



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

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

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


--------------------
ИМХО задница есть универсальный интерфейс. Ибо через задницу можно сделать абсолютно ВСЕ (bash.org.ru)

Дядька всегда можно спросить в аське, если не задалбывать - не откажет smile
И вообще, на самом деле я студент, и ненавижу обращение на "Вы") Тут все свои  ;)
PM MAIL ICQ Jabber   Вверх
Veitmen
Дата 25.8.2007, 14:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 288
Регистрация: 10.11.2006
Где: СПБ

Репутация: 3
Всего: 4



Нашел что у 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);
            }
        }

PM MAIL ICQ   Вверх
jonie
Дата 25.8.2007, 23:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

Репутация: 22
Всего: 118



стоит почитать : http://www.realcoding.net/article/view/2691


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
Veitmen
Дата 26.8.2007, 18:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 288
Регистрация: 10.11.2006
Где: СПБ

Репутация: 3
Всего: 4



Короче тут все решили.
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема »


 




[ Время генерации скрипта: 0.0485 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.