C # WinForms DataGridView цветовой рендеринг слишком медленный - PullRequest
9 голосов
/ 27 октября 2009

Я рисую свои строки в DataGridView так:

private void AdjustColors()
    {            
        foreach (DataGridViewRow row in aufgabenDataGridView.Rows)
        {
            AufgabeStatus status = (AufgabeStatus)Enum.Parse(typeof(AufgabeStatus), (string)row.Cells["StatusColumn"].Value);

            switch (status)
            {
                case (AufgabeStatus.NotStarted):
                    row.DefaultCellStyle.BackColor = Color.LightCyan;
                    break;
                case (AufgabeStatus.InProgress):
                    row.DefaultCellStyle.BackColor = Color.LemonChiffon;
                    break;
                case (AufgabeStatus.Completed):
                    row.DefaultCellStyle.BackColor = Color.PaleGreen;
                    break;
                case (AufgabeStatus.Deferred):
                    row.DefaultCellStyle.BackColor = Color.LightPink;
                    break;
                default:
                    row.DefaultCellStyle.BackColor = Color.White;
                    break;
            }
        }        
    }

Затем я вызываю его в методе OnLoad:

protected override void OnLoad(EventArgs e)
        {
            base.OnLoad(e);

            AdjustColors();           
        } 

Я предпочитаю OnLoad OnPaint или что-то еще .. потому что OnPaint вызывается очень часто.

Вопрос: почему для изменения фона каждой строки требуется около 100 - 200 мс? Раньше я делал doint CellPaint .. но у меня были проблемы при прокрутке с обновлением ..

Ответы [ 5 ]

11 голосов
/ 27 октября 2009

Вместо одновременного изменения цвета всего DataGrid, вы должны позволить ему управлять рендерингом, переопределяя событие CellFormatting. Строки будут окрашены только тогда, когда они действительно отображаются на экране.

private void aufgabenDataGridView_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e)
{
  DataGridViewRow row = aufgabenDataGridView.Rows[e.RowIndex];
  AufgabeStatus status = (AufgabeStatus) Enum.Parse(typeof(AufgabeStatus), (string) row.Cells["StatusColumn"].Value);

  switch (status)
  {
    case (AufgabeStatus.NotStarted):
      e.CellStyle.BackColor = Color.LightCyan;
      break;
    case (AufgabeStatus.InProgress):
      e.CellStyle.BackColor = Color.LemonChiffon;
      break;
    case (AufgabeStatus.Completed):
      e.CellStyle.BackColor = Color.PaleGreen;
      break;
    case (AufgabeStatus.Deferred):
      e.CellStyle.BackColor = Color.LightPink;
      break;
    default:
      e.CellStyle.BackColor = Color.White;
      break;
  }

}

Если это все еще слишком медленно, попробуйте получить реальный объект, с которым связана строка:

...
DataGridViewRow row = aufgabenDataGridView.Rows[e.RowIndex];
var aufgabe = (Aufgabe) row.DataBoundItem;
AufgabeStatus status = aufgabe.Status;
...
2 голосов
/ 04 октября 2010

Также рекомендуется устанавливать свойства, только если они отличаются от ожидаемого значения. Таким образом, вы не будете вызывать нежелательные внутренние издержки DataGridView.

Если все ячейки в строке отформатированы одинаково, вы можете выполнить форматирование на уровне строки вместо уровня ячейки.

DataGridViewCellStyle rowStyle = row.DefaultCellStyle;
if (rowStyle.BackColor != status.BackColor) { 
   rowStyle.BackColor = status.BackColor;
}
2 голосов
/ 27 октября 2009

Как сказал SwDevMan1, вы должны сначала поработать над удалением вызова Enum.Parse. Используете ли вы привязку данных для заполнения сетки? Если это так, вы можете использовать Rows [index] .DataBoundItem, чтобы получить доступ к объекту привязки данных для строки и получить прямой доступ к состоянию AufgabeStatus.

Второй твик, который я бы предложил, это вызвать SuspendLayout () и ResumeLayout () до и после, соответственно, манипулирования сеткой.

2 голосов
/ 27 октября 2009

Это, вероятно, вызов Enum.Parse, он имеет низкую производительность. Вы должны попытаться изменить его на поиск по словарю, чтобы увидеть, улучшает ли это производительность. Посмотреть сообщение

0 голосов
/ 13 сентября 2014

не пытайтесь форматировать строки as row.defaultcellstyle

попробуйте индивидуальное форматирование ячейки в ufgabenDataGridView_CellFormatting

клеток [0] = .style.backcolor color.yellow

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