C#WinForms DataGridView背景颜色渲染太慢

时间:2009-10-27 11:00:08

标签: c# winforms datagridview

我在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 个答案:

答案 0 :(得分:11)

您应该让它通过覆盖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;
...

答案 1 :(得分:2)

它可能是Enum.Parse调用,它的性能很差。您应该尝试将其更改为字典查找,以查看是否可以提高性能。见post

答案 2 :(得分:2)

正如SwDevMan1所说,你应该首先去除Enum.Parse调用。您是否使用数据绑定来填充网格?如果是这样,您可以使用Rows [index] .DataBoundItem来访问行的数据绑定对象并直接访问AufgabeStatus状态。

我建议的第二个调整是分别在操作网格之前和之后调用SuspendLayout()和ResumeLayout()。

答案 3 :(得分:2)

如果属性与预期值不同,那么仅设置属性也是一个好主意。这样就不会触发不必要的内部DataGridView开销。

如果一行中的所有单元格都以相同的方式格式化,则可以在行级而不是单元格级别进行格式化。

DataGridViewCellStyle rowStyle = row.DefaultCellStyle;
if (rowStyle.BackColor != status.BackColor) { 
   rowStyle.BackColor = status.BackColor;
}

答案 4 :(得分:0)

不要尝试行格式 as row.defaultcellstyle

尝试单个单元格格式化 ufgabenDataGridView_CellFormatting

细胞[0] = .style.backcolor color.yellow