У меня есть таблица 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 МБ в любом случае.
Посмотрите эти статьи (если вы еще этого не сделали):
Как это сделать: Реализуйте Virtual Mode в Windows Forms DataGridView Control