C# WinForms DataGridView background color rendering too slow

Instead of changing the color of the whole DataGrid at once, you should let it manage the rendering by overriding the CellFormatting event. The rows will only be painted when they are actually displayed on the screen.

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;
  }
}

If this is still too slow, try getting the real object the row is bound to:

...
DataGridViewRow row = aufgabenDataGridView.Rows[e.RowIndex];
var aufgabe = (Aufgabe) row.DataBoundItem;
AufgabeStatus status = aufgabe.Status;
...

Its probably the Enum.Parse call, it has poor performance. You should try and change it to a dictionary lookup to see if that improves performance. See this post


As SwDevMan1 said, you should first work on removing the Enum.Parse call. Are you using data binding to populate the grid? If so, you can use Rows[index].DataBoundItem to access the data bound object for the row and access the AufgabeStatus status directly.

The second tweak I would suggest is to call SuspendLayout() and ResumeLayout() before and after, respectively, manipulating the grid.