DataGridView CellFormatting事件阻止表单绘制

时间:2009-12-01 20:34:27

标签: c# winforms events datagridview paint

我正在使用C#,Winforms和.Net 3.5

我的表单有一个自定义DataGridView(双重缓冲以防止在我的单元格格式化事件期间出现闪烁,as seen here)。当我执行数据库搜索时,我将结果数据集绑定到datagridview

我处理CellFormatting事件以根据数据绘制特定颜色的行。

我的DataGridView代码:

resultsGridView.DataSource = results.DefaultViewManager.DataSet.Tables[0];
resultsGridView.AlternatingRowsDefaultCellStyle.BackColor = Color.AliceBlue;
resultsGridView.BorderStyle = BorderStyle.Fixed3D;
resultsGridView.CellFormatting += new DataGridViewCellFormattingEventHandler(resultsGridView_CellFormatting);

我的CellFormatting代码:

void resultsGridView_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e)
{
    int rowIndex = e.RowIndex;
    DataGridViewRow therow = resultsGridView.Rows[rowIndex];
    if ((bool)therow.Cells["Sealed"].Value == true)
    {
        therow.DefaultCellStyle.BackColor = Color.Pink;
    }
    if (therow.Cells["Database"].Value as string == "PNG")
    {
        therow.DefaultCellStyle.BackColor = Color.LightGreen;
    }
}

一切都很好,除了当我处理CellFormatting时,整个表单的Paint事件似乎被关闭了。光标在文本框中停止闪烁,表单的menustrip如下所示:

Menu bar picture

顶部是搜索之前,之后是底部。在我将鼠标放在菜单项所在的位置之前,菜鸟不会重绘,然后当我将鼠标移出菜单栏时,最后一个要突出显示的项目将保持这种状态。移动表单似乎会导致它重新绘制,但问题仍然存在。

在datagridview代码中注释掉resultsGridView.CellFormatting行可以完全解决问题。

我是否错误地绘制了细胞,或者我需要处理其他什么?

1 个答案:

答案 0 :(得分:1)

您可能在此事件中导致异常。我不确定如何定义处理,但是使用try catch包围代码将是第一步。

try 
{
   int rowIndex = e.RowIndex;
   ....   
}
catch(Exception ex)
{
    System.Diagnostics.Trace.Error(ex.message);
}

再看一下,我认为therow.Cells["Sealed"]不会起作用。尝试类似therow.Cells["dataGridViewTextBoxColumn2"]的内容。单元格由列名索引,而不是 DataPropertyName