У меня есть DataGridView (DGV), который я заполняю вручную (не привязан к источнику данных). Это относительно мало (12 столбцов х 62 строки). Когда моя форма загружается, она заполняет каждую ячейку данными из различных источников и применяет изменения стиля к некоторым ячейкам, например, цвет переднего плана, цвет фона и, возможно, изменение шрифта.
Все идет отлично, кроме стиль меняется. Я провел несколько тестов с использованием секундомеров, и форматирование занимает примерно в 2 раза больше времени, чем вся обработка заполнения формы. Мои вычисления довольно интенсивны, хотя я думаю, что применение форматирования будет почти мгновенным, поэтому я озадачен, почему применение некоторых изменений стиля занимает вдвое больше времени, чем мои интенсивные вычисления.
Я уже принял некоторые меры чтобы немного сократить время, например включить двойную буферизацию , а также приостановить рисование для моего DGV до начала моего форматирования и возобновить его после. Это очень помогло, а также устранило мерцание, которое происходило при перекрашивании каждой ячейки моего DGV. Насколько я могу судить, выполнение этих двух вещей помогло объединить фактическое рисование изменений стиля в одну операцию рисования. Таким образом, приблизительная схема загрузки моей формы выглядит следующим образом:
- Начало загрузки формы
- «SuspendDrawing» для DGV
- Заполнение DGV данными
- Применение изменений стиля к каждой ячейке
- «ResumeDrawing» для DGV и Refre sh (перерисовка) DGV.
Для пояснения, шаг 4 состоит только из строк например:
myCell.Style = New DataGridViewStyle()
myCell.Style.BackColor = ...
myCell.Style.ForeColor = ...
myCell.Style.Font = New Font()
На всех этих шагах 4-й этап занимает больше всего времени. Даже Шаг 5 почти мгновенный. Это не имеет смысла для меня. Рисование приостанавливается, когда выполняется шаг 4, поэтому графических вычислений и рисования не должно быть. Он должен просто хранить эти изменения стиля для каждой ячейки.
Итак, почему изменения стиля ячейки применяются так медленно, и что я могу сделать, чтобы ускорить его, кроме того, что у меня уже есть?
Обновление 2/5/20
Меня попросили предоставить воспроизводимый код. Мне нужно время, чтобы собрать MWE. Тем временем, надеюсь, это поможет: после заполнения таблицы (шаг 3 выше) я применяю стили ячеек в шаге 4 примерно так:
For Each row As DataGridViewRow In myDGV.Rows
For Each cell As DataGridViewCell In row.Cells
Select Case [somecondition]
Case X
cell.Style = New DataGridViewStyle()
cell.Style.BackColor = Colors.White
cell.Style.ForeColor = Colors.Black
cell.Style.Font = New Font(DefaultFont, FontStyle.Italic)
Case Y
[similar]
Case ...
End Select
Next
Next