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

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

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

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

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 = Верный и строки VirtualListSize =100,000,000.

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

10
задан Ash 7 January 2010 в 14:32
поделиться