2

In a simple .NET WinForm I have a datagridview that is being color painted based on the value of cells. The code is working, but the rendered form is "shaky" (that look when a computer is constantly having to redraw and can't keep up). I am wondering if there's something I can do to eliminate this, or if there's something wrong with my code. Advice appreciated.

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

1 回答 1

2

在这种情况下,我已经看到了一些关于性能问题的线程DataGridView(使用CellFormatting, CellPainting, ...)。在处理大量数据时,可能是一个“已知问题” 。

可以肯定的是,您应该避免做一些过于复杂的CellFormating事情。我在您的代码中没有发现任何问题,但似乎没有经过优化

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

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


可能的优化:

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
        }
    }
}
于 2013-08-29T21:26:41.980 回答