在一个简单的.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);
}
}
答案 0 :(得分:2)
在这种情况下,我已经看到了DataGridView
的性能问题的一些主题(使用CellFormatting
,CellPainting
,...)。当处理大量数据时, 可能是<已知问题。
可以肯定的是,你应该避免在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
}
}
}