不幸的是,我找不到您的问题的完整解决方案,只能解决。
使用MSDN中的示例对 CellFormatting 事件进行了一些实验,结果我看到了您所看到的确切内容 -BackColor
显然已设置,但CellStyle
并未反映这一点。1
我发现的解决方法是不使用该DataGridViewCellFormattingEventArgs
CellStyle
属性,而是直接进入网格。这有一个缺点,您现在需要手动处理您不想格式化单元格的情况。
我在下面有一些代码显示了这一点 - 它再次只是修改了 MSDN 代码:
void dataGridView1_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e)
{
// If the column is the Artist column, check the
// value.
if (this.dataGridView1.Columns[e.ColumnIndex].Name == "Artist")
{
if (e.Value != null)
{
// Check for the string "pink" in the cell.
string stringValue = (string)e.Value;
stringValue = stringValue.ToLower();
if ((stringValue.IndexOf("pink") > -1))
{
// With the commented line below we cannot access the new style
//e.CellStyle.BackColor = Color.Pink;
// With this line we can!
dataGridView1.Rows[e.RowIndex].Cells[e.ColumnIndex].Style.BackColor = Color.Pink;
}
else
{
// With the original MSDN code the else block to reset the
// cell style was not needed.
dataGridView1.Rows[e.RowIndex].Cells[e.ColumnIndex].Style.BackColor = dataGridView1.DefaultCellStyle.BackColor;
}
}
}
}
1.我的理论是,这类似于人们对该.Refresh()
方法的困惑,其中DataGridView
有两个非常不同的视图,一个是屏幕上绘制的矩形,另一个是基础数据。使用.Refresh()
仅重绘矩形的方法,您不会刷新数据。我认为就是这样 - 该CellFormatting
事件仅在绘画期间格式化,并且对网格样式本身没有任何作用。