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, так как они, вероятно, являются причиной задержек.

Другие вопросы по тегам