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

C# DataGridView如何将指定列中已填充内容的单元格设为只读

实现方案

1. 初始化控件基础权限

首先全局设置所有列默认只读,再单独放开你指定允许编辑的目标列的整列权限,确保除目标列外所有内容不可修改:

// 遍历所有列设为只读
foreach (DataGridViewColumn col in dataGridView1.Columns)
{
    col.ReadOnly = true;
}
// 替换为你实际要开放编辑的列的Name或者索引
dataGridView1.Columns["允许编辑的列名"].ReadOnly = false;

2. 初始加载后批量锁定已填充单元格

数据绑定完成、初始内容加载完毕后,遍历目标列的所有单元格,将已有内容的单元格单独设为只读:

foreach (DataGridViewRow row in dataGridView1.Rows)
{
    var targetCell = row.Cells["允许编辑的列名"];
    // 可根据你实际的数据类型调整空值判断逻辑,避免误判数值、日期等类型的默认值
    if (targetCell.Value != null && !string.IsNullOrWhiteSpace(targetCell.Value.ToString()))
    {
        targetCell.ReadOnly = true;
    }
}

3. 实时锁定用户新提交的内容

订阅CellEndEdit事件,用户编辑完单元格提交内容后自动锁定该单元格,避免二次修改:

// 窗体初始化时注册事件
dataGridView1.CellEndEdit += DataGridView1_CellEndEdit;

// 事件处理逻辑
private void DataGridView1_CellEndEdit(object sender, DataGridViewCellEventArgs e)
{
    // 仅处理目标列的编辑事件
    if (dataGridView1.Columns[e.ColumnIndex].Name == "允许编辑的列名")
    {
        var editedCell = dataGridView1.Rows[e.RowIndex].Cells[e.ColumnIndex];
        if (editedCell.Value != null && !string.IsNullOrWhiteSpace(editedCell.Value.ToString()))
        {
            editedCell.ReadOnly = true;
        }
    }
}

补充说明

  • 若目标列绑定的是数值、日期等非字符串类型,需要对应调整空值判断逻辑,避免把0、DateTime.MinValue这类默认值误判为已填充内容
  • 如果有允许用户清空已填内容再重新编辑的需求,可以额外在CellBeginEdit事件中加判断逻辑,或者增加单独的解锁功能处理特殊场景

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 12:57:00