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
相关产品推荐
相关产品推荐

