C#:DataGridView数据更新后如何保留选中行及最后选中单元格?
在C#中DataGridView更新数据后保留选中行与单元格状态
要实现DataGridView更新数据后保留原选中行和单元格状态,核心思路是先保存选中状态的关键标识,更新数据后再通过标识匹配恢复状态,具体步骤如下:
一、保存当前选中状态
更新数据前,先记录选中行的唯一标识(比如数据的主键)和当前激活单元格的位置信息,避免直接用行索引(更新后行顺序可能变化)。
示例代码(假设绑定DataTable,主键列名为"Id")
// 保存所有选中行的主键 List<int> selectedRowIds = new List<int>(); foreach (DataGridViewRow row in dataGridView1.SelectedRows) { if (row.DataBoundItem is DataRowView rowView) { selectedRowIds.Add(Convert.ToInt32(rowView["Id"])); } } // 保存当前激活单元格的行主键和列名 int? activeRowId = null; string activeColumn = null; if (dataGridView1.CurrentCell != null) { var activeRowView = dataGridView1.CurrentCell.OwningRow.DataBoundItem as DataRowView; if (activeRowView != null) { activeRowId = Convert.ToInt32(activeRowView["Id"]); activeColumn = dataGridView1.CurrentCell.OwningColumn.Name; } }
二、执行数据更新操作
完成选中状态保存后,执行你的数据更新逻辑(比如重新查询数据库、刷新数据源):
// 示例:替换为你的实际更新逻辑 DataTable updatedData = GetLatestDataFromDB(); dataGridView1.DataSource = updatedData; // 如果使用BindingSource,可调用ResetBindings避免重新赋值DataSource // bindingSource.ResetBindings(false);
三、恢复选中状态
数据更新完成后,通过之前保存的主键和列信息,匹配并恢复选中行与单元格状态:
// 清空现有选中,恢复之前的选中行 dataGridView1.ClearSelection(); foreach (DataGridViewRow row in dataGridView1.Rows) { if (row.DataBoundItem is DataRowView rowView && selectedRowIds.Contains(Convert.ToInt32(rowView["Id"]))) { row.Selected = true; } } // 恢复激活的单元格 if (activeRowId.HasValue && !string.IsNullOrEmpty(activeColumn)) { foreach (DataGridViewRow row in dataGridView1.Rows) { var rowView = row.DataBoundItem as DataRowView; if (rowView != null && Convert.ToInt32(rowView["Id"]) == activeRowId.Value) { var targetCell = row.Cells[activeColumn]; if (targetCell != null) { dataGridView1.CurrentCell = targetCell; // 若需要保持单元格编辑状态,可取消注释下面一行 // dataGridView1.BeginEdit(true); } break; } } }
关键注意事项
- 优先使用主键匹配:不要依赖行索引,更新数据后行的顺序、数量可能变化,主键是唯一可靠的匹配依据。
- 自定义实体数据源适配:如果绑定的是自定义实体类集合,只需将代码中的
DataRowView替换为你的实体类型,保存实体的唯一标识(比如entity.Id)即可。 - 优化性能:更新数据前可调用
dataGridView1.SuspendLayout(),更新完成后调用dataGridView1.ResumeLayout(true),避免控件频繁重绘导致闪烁。 - 单选场景简化:如果是单选模式,只需保存单个选中行的主键和单元格信息,无需用集合存储。
内容的提问来源于stack exchange,提问作者Dante
相关产品推荐
相关产品推荐

