1

如果我们e.CellStyle.BackColor通过 DataGridView 的 CellFormatting 事件将样式(比如说)应用于某些行,那么是否可以在稍后阶段检测到该样式?

例如,目前我们使用通用代码块来处理任何和所有 DataGridView 的打印和导出到 Excel。到目前为止,代码还没有满足任何样式。

所以我们想把它添加进去。

如果我们检查.DefaultCellStyle行或单元格的,那么我们的样式不会显示(它只是显示为 0 或黑色,这是完全错误的)。

我认为这是因为我们通过 CellFormatting 事件应用了样式,而不是将其嵌入到 DefaultCellStyle 中。

4

2 回答 2

1

不幸的是,我找不到您的问题的完整解决方案,只能解决。

使用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事件仅在绘画期间格式化,并且对网格样式本身没有任何作用。

于 2012-05-16T10:21:51.027 回答
-1

一种可能的解决方案是向通用打印代码块添加第二个处理程序(就在实际打印之前)。此处理程序应附加到CellFormatting事件并仅将其保存e.cellstyle在临时存储中(例如单元格样式字典)。

在您的原始单元格格式化期间应用的所有单元格样式都可以在您的通用打印代码中读取,而无需调整已绑定到 datagridview 的特定单元格格式化事件。在打印结束时,您可以再次移除处理程序。

另请参阅有没有办法强制 DataGridView 为所有单元格触发其 CellFormatting 事件?

于 2015-06-24T12:48:29.100 回答