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

C#如何比较DataGridView列值与今日日期并在状态列显示对应状态

代码问题排查

你原有代码的问题如下:

  • 取值错误:读取的是单元格的ErrorText(错误提示文本),而非单元格存储的日期值,应该取Value属性
  • 样式作用范围错误:修改的是整个DataGridView的默认样式DefaultCellStyle,会覆盖所有行的样式,应该单独修改当前遍历行的样式
  • 判断逻辑写反:距离过期日大于3天属于正常激活状态,原有逻辑直接标红了
  • 日期比较未去除时间部分,会出现同一天内时间不同导致的判断误差

实现代码

首先提前在dataGridView2中新增一个文本列,列索引设为10,用于展示状态。修改后的代码如下:

private void dataGridView2_DataBindingComplete(object sender, DataGridViewBindingCompleteEventArgs e)
{
    // 只取日期部分,忽略时间避免判断误差
    DateTime today = DateTime.Now.Date;
    
    foreach (DataGridViewRow row in dataGridView2.Rows)
    {
        // 跳过新行模板
        if (row.IsNewRow) continue;
        
        // 读取过期日期,加非空判断避免转换报错
        var expCellValue = row.Cells[9].Value;
        if (expCellValue == null || expCellValue == DBNull.Value)
        {
            row.Cells[10].Value = "无过期日期";
            continue;
        }
        
        DateTime expdate = Convert.ToDateTime(expCellValue).Date;
        TimeSpan diff = expdate - today;
        
        // 根据差值匹配状态和样式
        if (diff.TotalDays <= 0)
        {
            row.Cells[10].Value = "过期";
            row.DefaultCellStyle.BackColor = Color.Red;
        }
        else if (diff.TotalDays <= 3)
        {
            row.Cells[10].Value = $"还有{diff.TotalDays}天过期";
            row.DefaultCellStyle.BackColor = Color.Yellow;
        }
        else
        {
            row.Cells[10].Value = "激活";
            row.DefaultCellStyle.BackColor = Color.Green;
        }
    }
}

补充说明

如果不需要单独的状态列,你可以直接把状态值赋值到过期日期列,或者只保留样式修改逻辑即可。如果日期列的索引不是9,可以自行调整代码里的列索引数值。

内容的提问来源于stack exchange,提问作者Zameerul Haq

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 05:45:05