C# WinForms DataGridView background color rendering too slow

后端 未结 5 1707
挽巷
挽巷 2021-02-20 14:52

I\'m painting my rows in a DataGridView like this:

private void AdjustColors()
    {            
        foreach (DataGridViewRow row in aufgabenDataGridView.Row         


        
相关标签:
5条回答
  • 2021-02-20 15:25

    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.

    0 讨论(0)
  • 2021-02-20 15:31

    don't try row format as row.defaultcellstyle

    try individual cell formatting in ufgabenDataGridView_CellFormatting

    cell[0].style.backcolor=color.yellow

    0 讨论(0)
  • 2021-02-20 15:33

    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;
    ...
    
    0 讨论(0)
  • 2021-02-20 15:44

    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

    0 讨论(0)
  • 2021-02-20 15:47

    It's also a good idea to only set the properties if they differ from the expected value. That way you don't trigger unwanted internal DataGridView overhead.

    If all cells in a row are formatted the same way, you can do the formatting on row level instead of cell level.

    DataGridViewCellStyle rowStyle = row.DefaultCellStyle;
    if (rowStyle.BackColor != status.BackColor) { 
       rowStyle.BackColor = status.BackColor;
    }
    
    0 讨论(0)
提交回复
热议问题