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
相关产品推荐
相关产品推荐

