DataGridView, виртуальный режим и "лаги"
Мой код выглядит следующим образом:
private void dataGridView4_CellValueNeeded(object sender, DataGridViewCellValueEventArgs e)
{
Records recordsTmp = null;
recordsTmp = (Records)this.ArrayOfRecords[e.RowIndex]; //ArrayList with string[] objects inside
switch (dataGridView4.Columns[e.ColumnIndex].HeaderText)
{
case "#":
e.Value = recordsTmp.nr;
break;
case "ip":
e.Value = recordsTmp.Ip;
break;
case "long":
e.Value = recordsTmp.Long;
break;
case "3":
e.Value = recordsTmp.type;
break;
case "4":
e.Value = recordsTmp.time;
break;
}
ArrayOfRecords
обновляется с 10-100 новыхstring[]
объектов в секунду.VirtualMode
установлен в true.SelectionMode
установлен вFullRowSelect
,dataGridView
только для чтения.
Теперь есть также ProgressBar
с Marquee
стиль, который показывает мне, что с скажем, 5000+ прокрутка строк замораживает Form
но я предполагаю, что это просто вопрос работы с потоками / второстепенным и т.д.
Больше всего меня пугает выбор. Имея 8000 строк и нажимая последнюю (8000), у меня уходит 4,2 секунды, чтобы выбрать ее. И это следующим образом:
4000 строк составляют 2,1 секунды и т. Д. Если выбран 8000-й ряд, минимизация, а затем максимизация занимает 4,2 секунды. Выбор строки 1 снова "радует". Это неприемлемо. * Почему так сложно "пометить" 8-й ряд для моего Form
?
Нумерация страниц VirtualMode работает отлично, но выбор - это боль.
Theres также другая проблема / поведение:
Зачем CellValueNeeded
событие возникает, когда я двигаю мышью по строкам? Они уже нарисованы? Так почему это тратить ресурсы?
Есть ли решение для этой проблемы выбора? Или я должен ограничить максимальное количество записей в сетке данных
1 ответ
Одной вещью, с которой вы хотите поиграть, является автоматическое изменение размеров ячеек, так как вид сетки должен пройти через все ваши ячейки, чтобы найти ячейку с самой длинной длиной. Вы должны отключить автоматическое изменение размера, и вы должны сделать это программно. Что касается вашей проблемы выбора: выбор вызывает много перерисовок, моя догадка в том, что перерисовывает все ваши ячейки, поэтому задержка пропорциональна количеству строк / ячеек.
Чтобы использовать виртуальный режим, вам нужно больше, чем просто установить для VirtualMode значение true. Было бы интересно увидеть ваши методы dataGridView1_RowsAdded, dataGridView1_CellValuePush и dataGridView1_CellValidating, так как они, вероятно, являются причиной задержек.