DataGridView, виртуальный режим и «лаги» - PullRequest
2 голосов
/ 24 ноября 2011

Мой код выглядит следующим образом:

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 снова «радует». Это неприемлемо. * Почему так трудно "пометить" 8000-ую строку для моего Form?

Нумерация страниц VirtualMode работает отлично, но выбор - это боль.

Theres также другая проблема / поведение:

Почему событие CellValueNeeded возникает, когда я перемещаю мышь по строкам? Они уже нарисованы? Так зачем тратить ресурсы?

Есть ли решение этой проблемы выбора? Или я должен ограничить максимальное количество записей в сетке данных

1 Ответ

2 голосов
/ 19 февраля 2012

Одна вещь, с которой вы хотите поиграть, - это автоматическое изменение размеров ячеек, поскольку сетка должна пройти через все ваши ячейки, чтобы найти ячейку с самой длинной длиной. Вы должны отключить автоматическое изменение размера, и вы должны сделать это программно. Что касается вашей проблемы выбора: выбор вызывает много перерисовок, моя догадка заключается в том, что перерисовывает все ваши ячейки, поэтому задержка пропорциональна количеству строк / ячеек.

Чтобы использовать виртуальный режим, вам нужно больше, чем просто установить для VirtualMode значение true. Было бы интересно увидеть ваши методы dataGridView1_RowsAdded, dataGridView1_CellValuePush и dataGridView1_CellValidating, поскольку они, вероятно, являются виновниками задержек.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...