Применение изменений стиля к отдельным ячейкам в DataGridView выполняется очень медленно - PullRequest
0 голосов
/ 06 февраля 2020

У меня есть DataGridView (DGV), который я заполняю вручную (не привязан к источнику данных). Это относительно мало (12 столбцов х 62 строки). Когда моя форма загружается, она заполняет каждую ячейку данными из различных источников и применяет изменения стиля к некоторым ячейкам, например, цвет переднего плана, цвет фона и, возможно, изменение шрифта.

Все идет отлично, кроме стиль меняется. Я провел несколько тестов с использованием секундомеров, и форматирование занимает примерно в 2 раза больше времени, чем вся обработка заполнения формы. Мои вычисления довольно интенсивны, хотя я думаю, что применение форматирования будет почти мгновенным, поэтому я озадачен, почему применение некоторых изменений стиля занимает вдвое больше времени, чем мои интенсивные вычисления.

Я уже принял некоторые меры чтобы немного сократить время, например включить двойную буферизацию , а также приостановить рисование для моего DGV до начала моего форматирования и возобновить его после. Это очень помогло, а также устранило мерцание, которое происходило при перекрашивании каждой ячейки моего DGV. Насколько я могу судить, выполнение этих двух вещей помогло объединить фактическое рисование изменений стиля в одну операцию рисования. Таким образом, приблизительная схема загрузки моей формы выглядит следующим образом:

  1. Начало загрузки формы
  2. «SuspendDrawing» для DGV
  3. Заполнение DGV данными
  4. Применение изменений стиля к каждой ячейке
  5. «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

1 Ответ

0 голосов
/ 07 февраля 2020

Я последовал совету jmcilhinney, создал и настроил переменную Style для каждой итерации и присвоил ее ячейке, а не изменял Style каждой живой ячейки несколько раз. Это позволило ускорить форматирование примерно в 140 раз, сократив его с 1,4 до 0,01 секунды. Мой результирующий код выглядел примерно так:

For Each row As DataGridViewRow In myDGV.Rows
  For Each cell As DataGridViewCell In row.Cells
    Select Case [somecondition]
      Case X
        Dim styleVar as New DataGridViewStyle()
        styleVar.BackColor = Colors.White
        styleVar.ForeColor = Colors.Black
        styleVar.Font = New Font(DefaultFont, FontStyle.Italic)
        cell.Style = styleVar
      Case Y
        [similar]
      Case ...
    End Select
  Next
Next
...