![]() |
Модераторы: gambit, Partizan |
![]() ![]() ![]() |
|
Сергей Т. |
|
|||
Новичок Профиль Группа: Участник Сообщений: 18 Регистрация: 22.4.2005 Репутация: нет Всего: нет |
Мне необходимо загрузить в дерево справочник - около 70000 узлов (для справочников где данных 5000 узлов и менее все летает).
Создаю програмно дерево. В основном потоке загружаю его данными, и в это время у меня бежит индикатор. Загрузка идет быстро (2-5 сек). Затем я хочу положить его на форму. И вот здесь у меня трабл - когда дерево добавляется на форму это занимает времени до 3 минут Что в это время делается понять не могу.
Подскажите пожалуйста можно ли как-то уменьшить это время ? PS. Дерево я не создавал сразу на форме по двум причинам: - в потоке невозможно с ним работать - видно как долго летают скрол-бары и идет сортировка |
|||
|
||||
mr.DUDA |
|
|||
![]() 3D-маньяк ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 8244 Регистрация: 27.7.2003 Где: город-герой Минск Репутация: 24 Всего: 232 |
Тормозит формирование дерева, или этот код:
? З.Ы. для деревьев специально придумали такой паттерн как lazy load: подгрузка вложенных узлов по мере раскрытия. -------------------- ![]() |
|||
|
||||
Сергей Т. |
|
|||
Новичок Профиль Группа: Участник Сообщений: 18 Регистрация: 22.4.2005 Репутация: нет Всего: нет |
Формирование дерева происходит быстро 2-5 сек, тормоза начинаются когда я хочу отобразить визуально (на форме) . Я пытался отключать сортировку и скролинг, все равно тормозит. Значит тормозит наверно этот код.
PS. где можно посмотреть пример с lazy load. Полазил по инету только теория. |
|||
|
||||
mr.DUDA |
|
|||
![]() 3D-маньяк ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 8244 Регистрация: 27.7.2003 Где: город-герой Минск Репутация: 24 Всего: 232 |
Видимо, формирование иерархии TreeNode и формирование содержимого визуального компонента при загрузке - совершенно различные по длительности действия. Убедиться в этом можно, если для сначала добавить TreeView на форму, а уже потом добавить N тысяч узлов дерева.
Всё очень просто. Изначально заполняется только корневой уровень дерева - т.е. узлы, входящие в самый первый уровень. Далее мы добавляем обработчик BeforeExpand в дерево, и в нём проверяем, какой узел раскрывается. Соответстенно данному узлу, мы получаем список элементов, входящих в узел. И добавляем их в TreeNode, тем самым после раскрытия узла производится подгрузка только M узлов, где N и M - совершенно разные по порядку значения (N - несколько десятков тысяч, а M - примерно 1...100 в среднем). -------------------- ![]() |
|||
|
||||
Сергей Т. |
|
|||
Новичок Профиль Группа: Участник Сообщений: 18 Регистрация: 22.4.2005 Репутация: нет Всего: нет |
С технологией более менее стало понятно. Но как тогда быть в такой ситуации, например у меня одноуровневый справочник улиц, те при создании дерева все улицы являются корневыми узлами, а таких 60 тысяч. Технология не работает...
|
|||
|
||||
mr.DUDA |
|
|||
![]() 3D-маньяк ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 8244 Регистрация: 27.7.2003 Где: город-герой Минск Репутация: 24 Всего: 232 |
Гм, тогда однозначного решения не придумать. Lazy load тут не прокатит. -------------------- ![]() |
|||
|
||||
ivashkanet |
|
|||
![]() Кодю потиху ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3684 Регистрация: 23.2.2006 Где: Гомель, Беларусь Репутация: 11 Всего: 149 |
Сергей Т., пожалей своих юзверей.
Разве это реально что-нибудь найти если у тебя 60 000 узлов первого уровня? Попробуй структурировать/сгруппировать это дело. Например по алфавиту или по району. + добавь поиск по дереву. P.S. Так как загрузка данных идет быстро, то про Lazy Load можно не задумываться. Ведь отображение дерева все равно идет по этому принцыпу (было бы глупо не встроить его в само дерево) |
|||
|
||||
Дрон |
|
||||
![]() Java-ненавистник :) ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3179 Регистрация: 29.12.2002 Где: Санкт-Петербург Репутация: 2 Всего: 92 |
Из моих наблюдений вот такой код
выполняется в разы медленней, чем
Добавлено @ 17:32 Так же полезно перед началом добавления вызывать методы: BeginUpdate, а по окончанию EndUpdate. Но вообще ivashkanet прав ![]() -------------------- Да. Именно так. |
||||
|
|||||
Сергей Т. |
|
|||
Новичок Профиль Группа: Участник Сообщений: 18 Регистрация: 22.4.2005 Репутация: нет Всего: нет |
Я полностью с Вами согласен. Просто я переписываю готовую систему под .net, которая мне досталась на обслуживание по наследству (вернее я пришел на фирму, где система уже работала). Интерфейс работы со справочниками (и не только) был сделан не ввиде дерева, а использовался grid. Все работало быстро, но когда нужно было сформировать узел дерева (справочника) возникал кариес - нужно было вводить ручками уровень вложенности, кто кому parent, а кто child.
Но все равно спасибо Вам за идеи. Еще подумаю... ![]() |
|||
|
||||
kobra |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 730 Регистрация: 15.6.2005 Где: Грузия, Тбилиси Репутация: 1 Всего: 9 |
||||
|
||||
ivashkanet |
|
|||
![]() Кодю потиху ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3684 Регистрация: 23.2.2006 Где: Гомель, Беларусь Репутация: 11 Всего: 149 |
Не знаю как в обычном дереве, но DevExpress есть интересный компонент TreeList (дерево + грид в одном флаконе). Так в нем есть возможность заполнения дерева(грида) из таблицы. Для формирования дерева служат поля ID и ParentID. Т.е. новая строка "цепляется" к строке у которой ID = parentID текущей. P.S. Правда он платный (как и все более-менее нормальное ![]() P.P.S. Можно поискать бесплатный аналог на http://www.codeproject.com |
|||
|
||||
Сергей Т. |
|
|||
Новичок Профиль Группа: Участник Сообщений: 18 Регистрация: 22.4.2005 Репутация: нет Всего: нет |
Ok. Всем спасибо. Буду думать.
![]() |
|||
|
||||
![]() ![]() ![]() |
Прежде чем создать тему, посмотрите сюда: | |
|
Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов. Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :) Так же не забывайте отмечать свой вопрос решенным, если он таковым является :) Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle. |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Разработка Windows Forms | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |