基于日历值设置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
相关产品推荐
相关产品推荐

