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

C# Winforms DataGridView选中单元格值清空及赋值异常问题咨询

问题根因

两个报错和选中清空问题都来自单元格创建、赋值的顺序错误,以及行对象未关联DGV列模板:

  1. 新建DataGridViewRow后未绑定DGV的列结构,直接访问row.Cells[0]会因为Cells集合为空抛出越界异常
  2. 先把空行添加到DGV、再替换单元格的操作,会导致单元格的视图状态和数据绑定不一致,选中触发控件重绘时就会丢失自定义值
  3. RowsDefaultCellStyle.SelectionBackColor = Color.Transparent的设置会进一步加剧重绘时的显示异常
修复方案

调整行创建、赋值、添加的顺序,不需要手动新建DataGridViewTextBoxCell实例,用DGV自带的单元格创建方法即可:

  1. 新建行后先调用CreateCells()方法绑定当前DGV的列结构,自动生成对应单元格
  2. 直接修改单元格的Value和Style属性完成自定义配置
  3. 全部配置完成后再把行添加到DGV的Rows集合里
  4. 移除错误的透明选中背景色配置,改为需要的选中样式即可保留选中能力,不会清空值

修改后的核心代码(替换原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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 08:15:04