| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Базы данных под .NET > динамическое заполнение TreeView |
| Автор: Tiberian 26.2.2009, 14:29 |
| Если загружать из бд весь список объектов, которыми заполняется treeview, за раз, на это может уйти очень много времени при большом его объёме. Может, кто знает паттерны, как организовать динамическую подгрузку данных в привязке к treeview? |
| Автор: KelTron 26.2.2009, 19:28 |
| Очень хороший способ я как то увидел в книжке Петцольда по WinForms, он заключается в следующем: Если принять корень дерева за 1 уровень, то сначала загружаем все данные в 1 и 2 уровни (корень и его подкаталоги). При открытии корня загружаем подкаталоги его подкаталогов(3 уровень) При открытии какого - нибудь каталога 2 уровня, загружаем подкаталоги его подкаталогов(4 уровень) и т.д., тем самым при нажатии кнопки раскрытия каталога наша прога не будет думать по полчаса, отображая его подкаталоги, так как данные уже загружены и список быстро раскроется, а пока пользователь смотрит его, подгружается более глубокий уровень, не вызывая у пользователя желания разбить клавиатуру об монитор) Например: root --item1 --item11 --item111 --item12 --item2 --item21 --item212 --item22 --item221 --item222 --item3 Сначала грузятся: root, item1, item2, item3 Далее нажимаем на root - грузятся: item11, item12, item21, item22 Далее нажимаем, например, на item2 - грузятся: item212, item221, item222. Если бы нажали на item1, а не на item2 то загрузился бы только item111. Тем самым в процессе работы с деревом будут загружаться не все данные, а только те, которые нужны пользователю. (Если конечно он не раскроет все узлы...) |
| Автор: avosi 18.3.2009, 16:13 |
| а че сложного поставь условие что инициализируются только те узлы уровень вложений которых по отношению к корню =2 |
| Автор: KelTron 24.3.2009, 13:52 |
| Предлагаешь загружать только 2 уровень?) Тут же нужна динамическая подгрузка. Или ты предлагаешь грузить все узлы на 2 уровня ниже чем текущий? Тогда будут грузиться лишние данные. В приведённом выше способе грузятся только элементы выбранного поддерева. |
| Автор: Idsa 24.3.2009, 14:10 | ||
Самое простое решение - в обработчике события Collapsed считывать Id элемента (хранить можно, например, в Tag) - и делать запрос в базу
KelTron предложил очень интересный паттерн. И в некоторый случаях реализовать лучше именно его (хотя реализация будет немного сложнее). |
| Автор: -Mikle- 24.3.2009, 19:52 |
| На мой взгляд, этот вариант конечно же сокращает время подзагрузки, но тем не менее грузит избыточные данные. Если пользователь захочет выбрать элемент первого уровня, то он откроет корень и загрузятся все уровни "2" элементов уровня "1", хотя реально (возможно), пользователю и не потребуется открывать ни один из них. Думаю именно поэтому, мелкософты и большинство остальных компаний выбирают обычный алгортитм, когда грузится открываемая ветка и пользователь видит "Идет загрузка...". ИМХО, все части кода не оптимизируешь и пользователь все равно будет видеть такую надпись при выполнении других "долгих" частей программы... |
| Автор: sameness 20.2.2011, 13:29 |
| кто нибудь знает, как декларативно сделать привязку иерархических данных связанных по ключу к TreeView Silverlight? |
| Автор: -Mikle- 20.2.2011, 22:39 |
| Я знаю, но тут отвечать не буду... вы разделом ошиблись. Идите в раздел WPF Silverlight и напишите там, только сразу пишите подробнее. |