Как быстро отобразить большой объем данных

#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:

Я решил реализовать виртуальный / серверный режим для просмотра дерева.

Спасибо за ответы.