C#中DataGridView单元格与数值对比设置颜色异常问题
问题排查与修复方案
核心问题分析
你的代码存在几个致命错误,导致颜色设置完全失效:
- 错误获取判断值:你调用了
DGV2.Rows[11].Cells[3].ColumnIndex,这是取列的索引值(固定为3),而非单元格内的实际数值。拿3和96.69、94对比,逻辑完全错误。 - 条件覆盖问题:三个独立的
if会依次执行,就算第一个条件满足(数值>96.69),第二个if (>94)也会触发,把之前设置的绿色覆盖成黄色,最终显示错误颜色。 - 硬编码单元格且未利用事件参数:直接固定行11列3,既不符合CellFormatting事件的使用逻辑,也容易在表格结构变化时出错。
- 类型转换不合理:用
Convert.ToInt32处理带小数的数值,会丢失精度,应该用浮点型或decimal类型转换。
修复后的代码
private void DGV2_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e) { // 仅处理目标单元格:行索引11,列索引3 if (e.RowIndex != 11 || e.ColumnIndex != 3) return; // 处理单元格值为空的情况,避免转换报错 if (e.Value == null || string.IsNullOrEmpty(e.Value.ToString())) return; // 将单元格值转换为double类型(根据实际数据类型可调整为decimal) if (!double.TryParse(e.Value.ToString(), out double cellValue)) return; // 用else if保证条件互斥,避免颜色被覆盖 if (cellValue > 96.69) { e.CellStyle.BackColor = Color.LightGreen; } else if (cellValue > 94) { e.CellStyle.BackColor = Color.Yellow; } else if (cellValue < 94) { e.CellStyle.BackColor = Color.Red; } }
关键修复点说明
- 利用事件参数定位单元格:通过
e.RowIndex和e.ColumnIndex判断当前处理的是否为目标单元格,符合事件设计逻辑,减少不必要的计算。 - 正确获取单元格数值:使用
e.Value获取当前单元格的实际值,而非错误的ColumnIndex属性。 - 安全转换数值:用
double.TryParse代替强制转换,避免因值为空或格式错误抛出异常。 - 条件互斥:改用
else if,确保只会触发第一个符合的条件,不会出现颜色被后续条件覆盖的问题。 - 直接操作事件参数的CellStyle:通过
e.CellStyle设置样式,比直接访问单元格Style更高效,也符合CellFormatting事件的最佳实践。
内容的提问来源于stack exchange,提问作者Roman
相关产品推荐
相关产品推荐

