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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Загрузка большого объема данных в TreeView 
:(
    Опции темы
Сергей Т.
Дата 19.8.2006, 11:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Мне необходимо загрузить в дерево справочник - около 70000 узлов (для справочников где данных 5000 узлов и менее все летает).
Создаю програмно дерево. В основном потоке загружаю его данными, и в это время у меня бежит индикатор. Загрузка идет быстро (2-5 сек). 

Затем я хочу положить его на форму. И вот здесь у меня трабл - когда дерево добавляется на форму это занимает времени до 3 минут 
Что в это время делается понять не могу. 

Код


TreeView __new_tree = new TreeView();

... формирование дерева

this.Controls.Add(this.__new_tree);
this.Controls.SetChildIndex(this.__new_tree,0);



Подскажите пожалуйста можно ли как-то уменьшить это время ? 

PS. Дерево я не создавал сразу на форме по двум причинам:
- в потоке невозможно с ним работать
-  видно как долго летают скрол-бары  и идет сортировка  
PM MAIL   Вверх
mr.DUDA
Дата 19.8.2006, 12:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 24
Всего: 232



Тормозит формирование дерева, или этот код:
Цитата(Сергей Т. @  19.8.2006,  11:33 Найти цитируемый пост)
this.Controls.Add(this.__new_tree);
this.Controls.SetChildIndex(this.__new_tree,0);

?

З.Ы. для деревьев специально придумали такой паттерн как lazy load: подгрузка вложенных узлов по мере раскрытия.


--------------------
user posted image
PM MAIL WWW   Вверх
Сергей Т.
Дата 19.8.2006, 16:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Формирование дерева происходит быстро 2-5 сек, тормоза начинаются когда я хочу отобразить визуально (на форме) . Я пытался отключать сортировку и скролинг, все равно тормозит. Значит тормозит наверно этот код.

PS. где можно посмотреть пример с  lazy load. Полазил по инету только теория.
PM MAIL   Вверх
mr.DUDA
Дата 19.8.2006, 19:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 24
Всего: 232



Цитата(Сергей Т. @  19.8.2006,  16:22 Найти цитируемый пост)
Формирование дерева происходит быстро 2-5 сек, тормоза начинаются когда я хочу отобразить визуально (на форме) . Я пытался отключать сортировку и скролинг, все равно тормозит. Значит тормозит наверно этот код.

Видимо, формирование иерархии TreeNode и формирование содержимого визуального компонента при загрузке - совершенно различные по длительности действия. Убедиться в этом можно, если для сначала добавить TreeView на форму, а уже потом добавить N тысяч узлов дерева.

Цитата(Сергей Т. @  19.8.2006,  16:22 Найти цитируемый пост)
PS. где можно посмотреть пример с  lazy load. Полазил по инету только теория.

Всё очень просто. Изначально заполняется только корневой уровень дерева - т.е. узлы, входящие в самый первый уровень. Далее мы добавляем обработчик BeforeExpand в дерево, и в нём проверяем, какой узел раскрывается. Соответстенно данному узлу, мы получаем список элементов, входящих в узел. И добавляем их в TreeNode, тем самым после раскрытия узла производится подгрузка только M узлов, где N и M - совершенно разные по порядку значения (N - несколько десятков тысяч, а M - примерно 1...100 в среднем).


--------------------
user posted image
PM MAIL WWW   Вверх
Сергей Т.
Дата 21.8.2006, 13:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



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

 
PM MAIL   Вверх
mr.DUDA
Дата 21.8.2006, 14:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 24
Всего: 232



Цитата(Сергей Т. @  21.8.2006,  13:15 Найти цитируемый пост)
С технологией более менее стало понятно. Но как тогда быть в такой ситуации, например у меня одноуровневый справочник улиц, те при создании дерева все улицы являются корневыми узлами, а таких 60 тысяч. Технология не работает...

Гм, тогда однозначного решения не придумать. Lazy load тут не прокатит.


--------------------
user posted image
PM MAIL WWW   Вверх
ivashkanet
Дата 21.8.2006, 15:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодю потиху
****


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

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



Сергей Т., пожалей своих юзверей.
Разве это реально что-нибудь найти если у тебя 60 000 узлов первого уровня?
Попробуй структурировать/сгруппировать это дело. Например по алфавиту или по району.
+ добавь поиск по дереву.
P.S. Так как загрузка данных идет быстро, то про Lazy Load можно не задумываться. Ведь отображение дерева все равно идет по этому принцыпу (было бы глупо не встроить его в само дерево)
PM MAIL WWW ICQ   Вверх
Дрон
Дата 21.8.2006, 17:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Java-ненавистник :)
****


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

Репутация: 2
Всего: 92



Из моих наблюдений вот такой код
Код
TreeNode node = new TreeNode();
node.Text = "Preved!";

выполняется в разы медленней, чем
Код
TreeNode node = new TreeNode("Preved!");


Добавлено @ 17:32 
Так же полезно перед началом добавления вызывать методы: BeginUpdate, а по окончанию EndUpdate.

Но вообще ivashkanet прав smile


--------------------
Да. Именно так.
PM   Вверх
Сергей Т.
Дата 21.8.2006, 17:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Я полностью с Вами согласен. Просто я переписываю готовую систему под .net, которая мне досталась на обслуживание по наследству (вернее я пришел на фирму, где система уже работала).  Интерфейс работы со справочниками (и не только) был сделан не ввиде дерева, а использовался grid. Все работало быстро, но когда нужно было сформировать узел дерева (справочника) возникал кариес - нужно было вводить ручками уровень вложенности, кто кому parent, а кто child. 
Но все равно спасибо Вам за идеи. Еще подумаю...  smile  
PM MAIL   Вверх
kobra
Дата 22.8.2006, 09:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 730
Регистрация: 15.6.2005
Где: Грузия, Тбилиси

Репутация: 1
Всего: 9



Цитата(Сергей Т. @  21.8.2006,  17:47 Найти цитируемый пост)
нужно было вводить ручками уровень вложенности, кто кому parent, а кто child. 
в лубом случае так луще. и не стоит тут ползоватся TreeView.

PM MAIL   Вверх
ivashkanet
Дата 22.8.2006, 09:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодю потиху
****


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

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



Цитата(Сергей Т. @  21.8.2006,  17:47 Найти цитируемый пост)
 Все работало быстро, но когда нужно было сформировать узел дерева (справочника) возникал кариес - нужно было вводить ручками уровень вложенности, кто кому parent, а кто child. 

Не знаю как в обычном дереве, но DevExpress есть интересный компонент TreeList (дерево + грид в одном флаконе). Так в нем есть возможность заполнения дерева(грида) из таблицы. 
Для формирования дерева служат поля ID и ParentID. Т.е. новая строка "цепляется" к строке у которой ID = parentID текущей.
P.S. Правда он платный (как и все более-менее нормальное smile )
P.P.S. Можно поискать бесплатный аналог на http://www.codeproject.com
PM MAIL WWW ICQ   Вверх
Сергей Т.
Дата 23.8.2006, 16:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



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

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


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

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Разработка Windows Forms | Следующая тема »


 




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


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

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