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;
}
}
}
我希望这是有道理的。
我有一个 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;
}
}
}
我希望这是有道理的。