C#DataGridView CellFormatting

时间:2017-06-13 00:01:06

标签: c#

我尝试为DataGridView启用双缓冲,但性能仍然很差。在没有附加CellFormatting事件的情况下,我使用了大约5%的CPU,但是使用它,我的CPU使用了16% - 20%。打开双缓冲后,它接近25%。

我可以使用替代方法来改变细胞背景的颜色吗?

private void dataGridView1_CellFormatting(object sender, System.Windows.Forms.DataGridViewCellFormattingEventArgs e)
{
        {
            string s = (String)e.Value;
            s = s.Replace(" ",string.Empty);
            if (s != string.Empty && s.Length > 0)
            {
                GUIRow r = gui[e.RowIndex];
                DataGridViewCell cell;

                if(r.imLastBid){//.getSide() == domForm2.BID){

                        cell = dataGridView1[1, e.RowIndex];
                        cell.Style.BackColor = System.Drawing.Color.Salmon;
                    if(r.count){
                        cell = dataGridView1[2, e.RowIndex];
                        cell.Style.BackColor = System.Drawing.Color.Salmon;
                    }else{
                        cell = dataGridView1[2, e.RowIndex];
                        cell.Style.BackColor = System.Drawing.Color.OrangeRed;
                    }

                }else if(r.imLastAsk){
                        cell = dataGridView1[1, e.RowIndex];
                        cell.Style.BackColor = System.Drawing.Color.DarkSeaGreen;
                    if(r.count){
                        cell = dataGridView1[2, e.RowIndex];
                        cell.Style.BackColor = System.Drawing.Color.DarkSeaGreen;
                    }else{
                        cell = dataGridView1[2, e.RowIndex];
                        cell.Style.BackColor = System.Drawing.Color.SeaGreen;
                    }



                }
                else{
                    cell = dataGridView1[2, e.RowIndex];
                    cell.Style.BackColor = System.Drawing.Color.White;
                    cell = dataGridView1[1, e.RowIndex];
                    cell.Style.BackColor = System.Drawing.Color.White;
                }

                if(r.imLastPrice){
                    cell = dataGridView1[0, e.RowIndex];
                    cell.Style.BackColor = System.Drawing.Color.Yellow;

                }else{
                    cell = dataGridView1[0, e.RowIndex];
                    cell.Style.BackColor = System.Drawing.Color.White;
                }


            }
            else{
                DataGridViewCell cell;
                cell = dataGridView1[1, e.RowIndex];
                cell.Style.BackColor = System.Drawing.Color.White;
                cell = dataGridView1[2, e.RowIndex];
                cell.Style.BackColor = System.Drawing.Color.White;
            }

        }
    }

2 个答案:

答案 0 :(得分:1)

您可以优化一些逻辑。请考虑以下代码:

string s = (String)e.Value;
s = s.Replace(" ",string.Empty);   // <--- creates a new string, uh oh
if (s != string.Empty && s.Length > 0)

您正在每个绘制事件上创建一个新字符串。这对于GUI事件来说是一项昂贵的操作,因此尽可能避免内存分配。相反,使用这个:

string s = (String)e.Value;
if (!String.IsNullOrWhiteSpace(s))

这就是IsNullOrWhiteSpace的实施方式:

if (value == null)
{
    return true;
}
for (int i = 0; i < value.Length; i++)
{
    if (!char.IsWhiteSpace(value[i]))
    {
        return false;
    }
}
return true;

如您所见,它避免了创建新字符串。

单独尝试此更改,看看您的效果是否有所改善。

答案 1 :(得分:0)

您正在寻求优化单元格格式。我同意在那里进行优化,但我认为你会发现大多数性能问题都来自于网格填充时的渲染和重新渲染。为了提高性能,我建议您查看DataGridView控件的其他几个常见性能问题:

  1. 在绑定和/或重新填充之前隐藏DataGridView,并在填充后再次显示它。这通常会极大地加快速度。

  2. 检查(并最好禁用)各种自动调整属性,无论是设计时还是数据绑定之前,for example

    dataGridView1.RowHeadersWidthSizeMode = DataGridViewRowHeadersWidthSizeMode.EnableResizing; //or even better .DisableResizing. Default is DataGridViewRowHeadersWidthSizeMode.AutoSizeToAllHeaders
    
  3. 仅使用Virtual Mode和分页立即加载所需的行。