#windows #tree
#Windows #дерево
Вопрос:
У меня есть большая таблица базы данных, которую мне нужно отобразить в форме Windows. Данные представляют собой своего рода «список категорий», который мне нужно отобразить пользователю в виде древовидной структуры, есть категории с большим количеством подкатегорий. Элемент управления Treeview имеет задержку загрузки, но проблема в том, что может быть сто тысяч корневых узлов со строковыми значениями 4 столбцов. Я попытался добавить 100000 узлов в treeview, и для завершения потребовалось 5 минут. Существуют ли какие-либо другие варианты такой операции? Можете ли вы подсказать мне какие-нибудь идеи? Это не обязательно должно быть представление в виде дерева..
Ответ №1:
Узлов много, но вы пробовали вызывать BeginUpdate(), а затем EndUpdate() при добавлении списка узлов в treeview? Это, вероятно, немного повысило бы вашу производительность!
http://msdn.microsoft.com/en-us/library/system.windows.forms.treeview.beginupdate.aspx
Для подобных приложений я обычно использую такие функции, как «поиск по мере ввода», которые возвращают названия категорий по мере их ввода в текстовое поле. Например, при каждом нажатии клавиши я бы возвращался к базе данных и возвращал около 10 лучших значений, которые начинаются с того, что находится в текстовом поле. Если результатов больше 10, я либо указываю, что присутствуют дополнительные результаты, либо прошу их уточнить поиск. IMO прямой поиск всегда превосходит сортировку и / или подкачку. Я ненавижу подкачку. Почти всегда это признание того, что ваши функции поиска недостаточно хороши!
Ответ №2:
Возможно, реализовать какой-то механизм подкачки. 100 000 элементов в древовидном представлении было бы очень трудно прочитать с точки зрения пользователя. Одновременное предоставление всего 1000 или даже меньшего количества корневых узлов, безусловно, сократит время загрузки.
Ответ №3:
Вы можете использовать возможности кэша. Загрузка 20000 записей обычно занимает 0,2 секунды. Проверьте языковую поддержку, чтобы использовать ее.
с уважением,
Ответ №4:
В TreeView происходит событие перед расширением. Вы можете использовать его, чтобы «на лету» определить, содержимое какого узла загружать. То есть сначала вы загружаете только узлы верхнего уровня в свой TreeView.
Если пользователь собирается развернуть узел, вы можете извлечь необходимые данные и заполнить подсети этого узла. Используйте свойство Tag TreeNode для сохранения идентификатора, какие данные какому узлу принадлежат.
Обязательно используйте BeginUpdate() и EndUpdate() или используйте AddRange() вместо Add() для добавления узлов, потому что это намного быстрее.
Ответ №5:
Я решил реализовать виртуальный / серверный режим для просмотра дерева.
Спасибо за ответы.