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

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

Ответы [ 3 ]

29 голосов
/ 22 мая 2011

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

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

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

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

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

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

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

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

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

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

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

14 голосов
/ 30 мая 2011

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

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

0 голосов
/ 22 мая 2011

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...