You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 10:40:41