| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Разработка Windows Forms > Загрузка большого объема данных в TreeView |
| Автор: Сергей Т. 19.8.2006, 11:33 | ||
| Мне необходимо загрузить в дерево справочник - около 70000 узлов (для справочников где данных 5000 узлов и менее все летает). Создаю програмно дерево. В основном потоке загружаю его данными, и в это время у меня бежит индикатор. Загрузка идет быстро (2-5 сек). Затем я хочу положить его на форму. И вот здесь у меня трабл - когда дерево добавляется на форму это занимает времени до 3 минут Что в это время делается понять не могу.
Подскажите пожалуйста можно ли как-то уменьшить это время ? PS. Дерево я не создавал сразу на форме по двум причинам: - в потоке невозможно с ним работать - видно как долго летают скрол-бары и идет сортировка |
| Автор: Сергей Т. 19.8.2006, 16:22 |
| Формирование дерева происходит быстро 2-5 сек, тормоза начинаются когда я хочу отобразить визуально (на форме) . Я пытался отключать сортировку и скролинг, все равно тормозит. Значит тормозит наверно этот код. PS. где можно посмотреть пример с lazy load. Полазил по инету только теория. |
| Автор: mr.DUDA 19.8.2006, 19:54 | ||||
Видимо, формирование иерархии TreeNode и формирование содержимого визуального компонента при загрузке - совершенно различные по длительности действия. Убедиться в этом можно, если для сначала добавить TreeView на форму, а уже потом добавить N тысяч узлов дерева.
Всё очень просто. Изначально заполняется только корневой уровень дерева - т.е. узлы, входящие в самый первый уровень. Далее мы добавляем обработчик BeforeExpand в дерево, и в нём проверяем, какой узел раскрывается. Соответстенно данному узлу, мы получаем список элементов, входящих в узел. И добавляем их в TreeNode, тем самым после раскрытия узла производится подгрузка только M узлов, где N и M - совершенно разные по порядку значения (N - несколько десятков тысяч, а M - примерно 1...100 в среднем). |
| Автор: Сергей Т. 21.8.2006, 13:15 |
| С технологией более менее стало понятно. Но как тогда быть в такой ситуации, например у меня одноуровневый справочник улиц, те при создании дерева все улицы являются корневыми узлами, а таких 60 тысяч. Технология не работает... |
| Автор: mr.DUDA 21.8.2006, 14:06 | ||
Гм, тогда однозначного решения не придумать. Lazy load тут не прокатит. |
| Автор: ivashkanet 21.8.2006, 15:34 |
| Сергей Т., пожалей своих юзверей. Разве это реально что-нибудь найти если у тебя 60 000 узлов первого уровня? Попробуй структурировать/сгруппировать это дело. Например по алфавиту или по району. + добавь поиск по дереву. P.S. Так как загрузка данных идет быстро, то про Lazy Load можно не задумываться. Ведь отображение дерева все равно идет по этому принцыпу (было бы глупо не встроить его в само дерево) |
| Автор: Дрон 21.8.2006, 17:30 | ||||
Из моих наблюдений вот такой код
выполняется в разы медленней, чем
Добавлено @ 17:32 Так же полезно перед началом добавления вызывать методы: BeginUpdate, а по окончанию EndUpdate. Но вообще ivashkanet прав |
| Автор: Сергей Т. 21.8.2006, 17:47 |
| Я полностью с Вами согласен. Просто я переписываю готовую систему под .net, которая мне досталась на обслуживание по наследству (вернее я пришел на фирму, где система уже работала). Интерфейс работы со справочниками (и не только) был сделан не ввиде дерева, а использовался grid. Все работало быстро, но когда нужно было сформировать узел дерева (справочника) возникал кариес - нужно было вводить ручками уровень вложенности, кто кому parent, а кто child. Но все равно спасибо Вам за идеи. Еще подумаю... |
| Автор: kobra 22.8.2006, 09:40 | ||
|
| Автор: ivashkanet 22.8.2006, 09:51 | ||
Не знаю как в обычном дереве, но DevExpress есть интересный компонент TreeList (дерево + грид в одном флаконе). Так в нем есть возможность заполнения дерева(грида) из таблицы. Для формирования дерева служат поля ID и ParentID. Т.е. новая строка "цепляется" к строке у которой ID = parentID текущей. P.S. Правда он платный (как и все более-менее нормальное P.P.S. Можно поискать бесплатный аналог на http://www.codeproject.com |
| Автор: Сергей Т. 23.8.2006, 16:20 |
| Ok. Всем спасибо. Буду думать. |