Подтвердить что ты не робот

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

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

4b9b3361

Ответ 1

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

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

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

Или, для ListView control:

Установка свойства 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.

Ответ 2

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

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

Ответ 3

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

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