Я хочу отобразить > 50000 строк в таблице. Какой из них лучше всего использовать: DataGrid или ListView (в подробном представлении)? Какой из этих элементов управления будет иметь лучшую производительность?
Что лучше использовать: DataGrid или ListView для отображения больших объемов данных?
Ответ 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
стоит дорого, сохранение кеша может повысить производительность.В виртуальном режиме коллекция
Items
отключена. Попытка получить доступ к ней приводит кInvalidOperationException
. То же самое относится к коллекцииCheckedItems
иSelectedItems
коллекция. Если вы хотите получить выбранные или отмеченные элементы, используйтеSelectedIndices
иCheckedIndices
.
Ответ 2
Используйте FastObjectListView
из проекта ObjectListView.
50 000 строк ничего, с автоматической сортировкой, фильтрацией, поиском по типу и множеством других добра:)
Ответ 3
не делать. Если вы хотите сделать что-то подобное, загрузите первые 500 строк и последние 100. Когда пользователь прокручивает сто строк, загрузите следующую партию автоматически. В Ctrl + End отобразите последние 100 и предварительно загрузите предыдущую партию в случае, если пользователь прокручивается вверх.
Играйте с цифрами, пока не получите что-то приятное для пользователя без фактической загрузки 50K строк