Реализует ли Windows Forms DataGridView настоящий виртуальный режим?

У меня есть таблица SQL, содержащая в настоящее время 1 миллион строк, которые будут расти со временем.

Существует специальное требование пользователя представить сортируемую сетку, которая отображает все строки без разбивки на страницы. Пользователь ожидает, что сможет очень быстро переходить от строки к строке и сверху вниз с помощью полосы прокрутки.

Я знаком с сетками «виртуального режима», которые представляют только видимое подмножество общих данных. Они могут обеспечить отличную производительность пользовательского интерфейса и минимальные требования к памяти (я даже реализовал приложение, использующее эту технику много лет назад).

Windows Forms DataGridView предоставляет виртуальный режим, который выглядит так, как будто он должен быть ответом. Однако в отличие от других виртуальных режимов, с которыми я сталкивался, он по-прежнему выделяет память для каждой строки (подтверждено в ProcessExplorer). Очевидно, что это приводит к ненужному значительному увеличению общего использования памяти, и при выделении этих строк происходит заметная задержка. Производительность прокрутки также страдает на 1 миллион + строк.

В реальном виртуальном режиме нет необходимости выделять память для строк, которые не отображаются. Вы просто даете ему общее количество строк (например, 1 000 000), и все, что делает сетка, это соответственно масштабирует полосу прокрутки. Когда он отображается в первый раз, сетка просто запрашивает данные по первым n (скажем, 30) видимым строкам, мгновенное отображение.

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

Вот пример кода DataGridView, который я сейчас использую:

public void AddVirtualRows(int rowCount)
{
    dataGridList.ColumnCount = 4;


    dataGridList.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.None;
    dataGridList.AutoSizeRowsMode = DataGridViewAutoSizeRowsMode.None;

    dataGridList.VirtualMode = true;

    dataGridList.RowCount = rowCount;

    dataGridList.CellValueNeeded += new DataGridViewCellValueEventHandler(dataGridList_CellValueNeeded);


}
void dataGridList_CellValueNeeded(object sender, DataGridViewCellValueEventArgs e)
{
    e.Value = e.RowIndex;
}

Я что-то здесь упускаю или «виртуальный» режим DataGridView на самом деле совсем не виртуальный?

[Обновить]

Похоже, старый добрый ListView реализует именно тот виртуальный режим, который я ищу. Но, к сожалению, ListView не имеет возможностей форматирования ячеек DataGridView, поэтому я не могу его использовать.

Для других, которые могли бы это сделать, я протестировал его с помощью ListView с четырьмя столбцами (в режиме детализации), VirtualMode = True и VirtualListSize = 100 000 000 строк.

Список отображается сразу с видимыми первыми 30 строками. Затем я могу быстро перейти к нижней части списка без задержки. Использование памяти постоянно 10 МБ.

Ответы на вопрос(3)

Ваш ответ на вопрос