C# Winforms DataGridView选中单元格值清空及赋值异常问题咨询
问题根因
两个报错和选中清空问题都来自单元格创建、赋值的顺序错误,以及行对象未关联DGV列模板:
- 新建
DataGridViewRow后未绑定DGV的列结构,直接访问row.Cells[0]会因为Cells集合为空抛出越界异常 - 先把空行添加到DGV、再替换单元格的操作,会导致单元格的视图状态和数据绑定不一致,选中触发控件重绘时就会丢失自定义值
RowsDefaultCellStyle.SelectionBackColor = Color.Transparent的设置会进一步加剧重绘时的显示异常
修复方案
调整行创建、赋值、添加的顺序,不需要手动新建DataGridViewTextBoxCell实例,用DGV自带的单元格创建方法即可:
- 新建行后先调用
CreateCells()方法绑定当前DGV的列结构,自动生成对应单元格 - 直接修改单元格的
Value和Style属性完成自定义配置 - 全部配置完成后再把行添加到DGV的Rows集合里
- 移除错误的透明选中背景色配置,改为需要的选中样式即可保留选中能力,不会清空值
修改后的核心代码(替换原while循环部分)
while (rows <= totalRows) { DataGridViewRow row = new DataGridViewRow(); // 先绑定DGV列结构,自动生成对应单元格 row.CreateCells(roomSchedule); row.HeaderCell.Value = currentTimeSlot.ToString("HH:mm"); // 匹配预约时段时直接修改单元格属性 if (currentTimeSlot.TimeOfDay == bookingStart.TimeOfDay || currentTimeSlot.TimeOfDay == bookingStart2.TimeOfDay) { if (room == "Sports Hall") { row.Cells[0].Value = "Class Name"; row.Cells[0].Style.BackColor = Color.Moccasin; } } // 全部配置完成后再添加行到DGV roomSchedule.Rows.Add(row); currentTimeSlot = currentTimeSlot.AddMinutes(30); rows++; } // 选中背景色不要设为透明,改为需要的颜色即可保留选中效果 roomSchedule.RowsDefaultCellStyle.SelectionBackColor = Color.LightBlue;
如果需要保留单元格只读不可编辑的属性同时支持选中,只需要加一行配置:
roomSchedule.EditMode = DataGridViewEditMode.EditProgrammatically;
该配置会禁止用户手动编辑单元格内容,但完全保留单元格选中、行选中等交互能力,不会出现选中清空值的问题。
内容的提问来源于stack exchange,提问作者Mark Buckley
相关产品推荐
相关产品推荐

