it-swarm.com.ru

Что лучше использовать: DataGrid или ListView для отображения больших объемов данных?

Я хочу отобразить> 50000 строк в таблице. Какой элемент управления лучше всего использовать: DataGrid или ListView (в подробном представлении)? Какой из этих элементов управления будет иметь лучшую производительность?

23
alex dee

Как говорит Ханс в комментарии к первоначальному вопросу, они оба будут иметь ужасную производительность, превосходящую только неудовольствие, которое ваши пользователи наверняка испытают при безумии такого количества строк данных, отображаемых одновременно.

Но если это неизбежно в вашем приложении (и вы предоставляете очень хорошую функцию поиска), тогда вам настоятельно рекомендуется использовать параметр virtual mode, независимо от того, какой элемент управления вы решили использовать. Это означает, что вы должны обеспечить свои собственные операции по управлению данными, а не полагаться на контроль, который сделает это за вас. Преимущество в том, что все намного быстрее. Как документация говорит:

Виртуальный режим предназначен для использования с очень большими хранилищами данных. Когда свойство VirtualMode имеет значение true, вы создаете DataGridView с заданным количеством строк и столбцов, а затем обрабатываете CellValueNeeded event для заполнения ячеек. Виртуальный режим требует реализации базового кэша данных для обработки заполнения, редактирования и удаления ячеек DataGridView на основе действий пользователя. Для получения дополнительной информации о реализации виртуального режима см. Как: реализовать виртуальный режим в элементе управления Windows Forms DataGridView .

Или, для ListView элемента управления :

Установка для свойства VirtualMode значения true переводит ListView в виртуальный режим. В виртуальном режиме обычная коллекция Items не используется. Вместо этого объекты ListViewItem создаются динамически, как того требует ListView.

Виртуальный режим может быть полезен при многих обстоятельствах. Если объект ListView должен быть заполнен из очень большой коллекции, уже находящейся в памяти, создание объекта ListViewItem для каждой записи может быть расточительным. В виртуальном режиме создаются только необходимые элементы. В других случаях значения объектов ListViewItem, возможно, придется часто пересчитывать, и выполнение этого для всей коллекции приведет к неприемлемой производительности. В виртуальном режиме рассчитываются только необходимые элементы.

Чтобы использовать виртуальный режим, вы должны обработать RetrieveVirtualItem событие , которое вызывается каждый раз, когда ListView требует элемент. Этот обработчик события должен создать объект ListViewItem, который принадлежит указанному индексу. Кроме того, свойство VirtualListSize должно быть равно размеру виртуального списка.

Обработка SearchForVirtualItem event позволяет выполнять поиск в виртуальном режиме. Если это событие не обрабатывается, методы FindItemWithText и FindNearestItem возвращают значение NULL.

Вы можете обрабатывать CacheVirtualItems событие , чтобы поддерживать кеш объектов ListViewItem. Если вычисления или поиск для создания объекта ListViewItem являются дорогостоящими, поддержание кэша может повысить производительность.

Если для параметра свойство View установлено значение Tile, значение автоматически изменится на LargeIcon, если для параметра VirtualMode установлено значение true.

В виртуальном режиме коллекция Items отключена. Попытка доступа к нему приводит к InvalidOperationException . То же самое верно для коллекции CheckedItems и коллекции SelectedItems . Если вы хотите получить выбранные или отмеченные элементы, используйте вместо них коллекции SelectedIndices и CheckedIndices .

28
Cody Gray

Используйте FastObjectListView из ObjectListView проекта. 

50000 строк - это ничто, с автоматической сортировкой, фильтрацией, поиском по типу и множеством других полезностей :)

13
Grammarian

Не. Если вы хотите сделать что-то подобное, загрузите первые 500 строк и последние 100. Когда пользователь прокрутит вниз до ста строк, автоматически загрузите следующую партию. На Ctrl + End отобразите последние 100 и предварительно загрузите предыдущий пакет на случай, если пользователь прокрутит вверх.

Играйте с числами, пока вы не получите что-то приятное для пользователя без фактической загрузки 50К строк

0
Sylverdrag