在.NET 4.5应用程序中导致渲染抖动的CellFormatting事件

时间:2013-08-29 18:05:08

标签: c# winforms datagridview

在一个简单的.NET WinForm中,我有一个datagridview,它根据单元格的值进行颜色绘制。代码正在运行,但呈现的形式是“摇摇欲坠”(当计算机不断重绘并无法跟上时)。我想知道我能做些什么来消除这个问题,或者我的代码是否有问题。建议表示赞赏。

private void gvPhoneQueue_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e)
        {
            try
            {
                if (gvPhoneQueue.Columns[e.ColumnIndex].HeaderText == "CallsWaiting")
                {
                    string convertedVal = e.Value.ToString();
                    if (Convert.ToInt32(convertedVal) > _greenTolerance)
                    {
                        gvPhoneQueue.Rows[e.RowIndex].DefaultCellStyle.BackColor = Color.Green;
                    }

                    if (Convert.ToInt32(convertedVal) > _yellowTolerance)
                    {
                        gvPhoneQueue.Rows[e.RowIndex].DefaultCellStyle.BackColor = Color.Yellow;
                    }

                    if (Convert.ToInt32(convertedVal) > _redTolerance)
                    {
                        gvPhoneQueue.Rows[e.RowIndex].DefaultCellStyle.BackColor = Color.Red;
                    }
                }
            }
            catch (System.Exception ex)
            {
                LogEvent("Error" _+ ex);
            }
        }

1 个答案:

答案 0 :(得分:2)

在这种情况下,我已经看到了DataGridView的性能问题的一些主题(使用CellFormattingCellPainting,...)。当处理大量数据时, 可能是<已知问题

可以肯定的是,你应该避免在CellFormating事件中做太复杂的事情。我的代码中没有出现问题,但似乎没有优化

  • 您使用3次Convert.ToInt32(convertedVal):您应该存储该值而不是将字符串值转换3倍。如果您使用Try Cath块,由于可能的转换错误,您可以使用int32.TryParse方法。

  • 我猜颜色不能同时是红色,黄色或绿色, _redTolerence是最高值?所以你应该从测试最高值开始,然后测试其他值,并且所以尽快退出方法,因此如果不需要,每次都不评估3 if个语句。在VB.Net中,我建议使用ElseIf语句但它在C#中不存在。在这种情况下,使用return将是相同的。 [修改 我在C#中的错误else if等于VB.Net中的ElseIf


可能的优化:

private void gvPhoneQueue_CellFormatting(object sender, System.Windows.Forms.DataGridViewCellFormattingEventArgs e)
{
    if (gvPhoneQueue.Columns(e.ColumnIndex).HeaderText == "CallsWaiting") {
        int convertVal = 0;
        if (int.TryParse(e.Value.ToString, convertVal)) {
            if (convertVal > _redTolerance) {
                gvPhoneQueue.Rows(e.RowIndex).DefaultCellStyle.BackColor = Color.Red;
            } else if (convertVal > _yellowTolerance) {
                gvPhoneQueue.Rows(e.RowIndex).DefaultCellStyle.BackColor = Color.Yellow;
            } else if (convertVal > _greenTolerance) {
                gvPhoneQueue.Rows(e.RowIndex).DefaultCellStyle.BackColor = Color.Green;
            }
        } else {
            //can't convert e.value
        }
    }
}