DataGridView 的 CellFormatting 问题

Issue with CellFormatting of a DataGridView

我有一个 DataGridView,其中填充了从多个表中提取的数据(我使用的是 SQLite,但我认为这与此处无关)。其中一列 (11) 可能有值或可能为空。如果有一个值,我想把行涂成绿色,如果没有,我什么都不做。我在 CellFormatting 中有这段代码来执行此操作:

private void dgv_CellFormatting(Object sender, DataGridViewCellFormattingEventArgs e)
{
    if (e.ColumnIndex == 11)
    {
        if (!String.IsNullOrEmpty(dgv.Rows[e.RowIndex].Cells[11].Value.ToString()))
        {
            dgv.Rows[e.RowIndex].DefaultCellStyle.BackColor = Color.Green;
        }
    }
}

如果第一行的第 11 列中没有值,则此方法非常有效,但如果有,则无论第 11 列中是否有值,整个 DataGridView 都显示为绿色。

在此先感谢您的帮助。

空条件运算符“?”在这种情况下可能会有所帮助。添加 ?在 Value 之后(请参阅下面我更新的代码片段)。

if(!String.IsNullOrEmpty(dgv.Rows[e.RowIndex].Cells[e.ColumnIndex].Value?.ToString()))
{
   dgv.Rows[e.RowIndex].DefaultCellStyle.BackColor = Color.Green;
}

我假设您想要的是“如果”第 11 列中单元格的值不为空,则将该行着色为绿色,并且如果第 11 列中单元格的值为空,则不要把它染成绿色。

发布的代码中的问题(我看到)是如果单元格 11 中的值为空,背景颜色永远不会设置回白色。

例如,使用发布的代码,假设第 0 行的第 11 列中有一个值并且它不为空!鉴于此,Cell_Formatting 事件将自动将第 0 行涂成绿色。现在,第 0 行显示为绿色,让我们单击第 0 行第 11 行的单元格,然后“删除”单元格 11 中的数据以使其为空。删除单元格 11 中的数据后,将触发 Cell_Formatting 事件。由于单元格 11 中的值为空,因此该行不会显示为绿色。

不幸的是,该行已经是绿色的。

这意味着无论单元格 11 中的值如何,每当一行变为绿色时......它将始终保持绿色。

如果单元格 11 中的值不为空,下面的代码会将行颜色更改为绿色,并且当单元格 11 中的值为空时,会将行颜色设置为白色。

private void dgv_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e) {
  if (e.ColumnIndex == 11) {
    if (!String.IsNullOrEmpty(dgv.Rows[e.RowIndex].Cells[11].Value.ToString())) {
      dgv.Rows[e.RowIndex].DefaultCellStyle.BackColor = Color.Green;
    }
    else {
      dgv.Rows[e.RowIndex].DefaultCellStyle.BackColor = Color.White;
    }
  }
}

我希望这是有道理的。