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

基于日历值设置DataGridView单元格背景色的逻辑错误排查求助

DataGridView 日期单元格背景色设置逻辑错误排查

核心问题分析

  • 行列索引完全混淆:原代码错误地将endBook_C-1作为单元格列索引,根据注释里的正确思路,应该用id-1(对应车辆ID列),当前写法导致所有高亮都集中在结束日期对应的列,完全偏离需求。
  • 循环逻辑自相矛盾:for循环中同时用i <= TotalDays作为条件,又在循环内执行TotalDays -= 1,会让循环次数直接减半,比如原本需要高亮5天,实际只执行3次循环,导致部分日期未被处理。
  • 日期天数计算不严谨:直接用endBook.Day - startBook.Day计算天数差,若日期跨月(比如起始是30号,结束是次月2号),会得到负数,循环根本不会执行。应该用(endBook - startBook).TotalDays获取准确的天数间隔。
  • 行索引可能偏移:DataGridView.Rows索引从0开始,但startBook.Day从1开始,若行是按日期1号对应第0行、2号对应第1行的逻辑排列,行索引需要减1,否则会选中下一行的单元格。

修正后的代码

while (dr.Read())
{
    int id = dr.GetInt32(0);
    DateTime startBook = dr.GetDateTime(2);
    DateTime endBook = dr.GetDateTime(3);

    // 计算准确的天数差,支持跨月场景
    int totalDays = (int)(endBook - startBook).TotalDays;
    // 行索引:根据表格实际结构调整,若1号对应第0行则减1,对应第1行则直接用startBook.Day
    int startRowIndex = startBook.Day - 1;
    // 列索引:对应车辆ID的列(假设ID从1开始)
    int targetColumnIndex = id - 1;

    // 设置起始日期单元格背景色
    dataGridView1.Rows[startRowIndex].Cells[targetColumnIndex].Style.BackColor = Color.Blue;

    // 循环处理中间日期的单元格
    for (int i = 1; i <= totalDays; i++)
    {
        int currentRowIndex = startRowIndex + i;
        // 避免行索引越界
        if (currentRowIndex < dataGridView1.Rows.Count)
        {
            dataGridView1.Rows[currentRowIndex].Cells[targetColumnIndex].Style.BackColor = Color.Blue;
        }
    }
}
Con.Close();

额外说明

如果你的DataGridView行是按日期1号对应第1行(索引1),则startRowIndex直接用startBook.Day即可,无需减1。若存在跨月预订,需确保表格包含跨月的日期行,否则超出部分会触发索引越界错误,代码中已添加判断避免此问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 16:22:47