如何用单个绑定TextBox批量修改DataGridView选中行对应DataTable列值
实现多选中行同步更新方案
问题原因
默认BindingSource仅会同步其Current属性指向的当前项,多选DataGridView行时,Current项为最后一条选中的行,因此默认绑定逻辑仅会更新该行。
实现步骤
不需要修改原有绑定代码,只需新增TextBox的提交事件监听,多选时批量更新所有选中行即可:
- 订阅TextBox的
Validated事件(输入完成失去焦点时触发,也可根据需求替换为TextChanged实现实时同步) - 事件处理逻辑中遍历所有选中行,批量赋值对应列
完整代码示例
事件订阅(可在窗体构造方法或Filling方法中添加)
txtData.Validated += TxtData_Validated;
事件处理方法
private void TxtData_Validated(object sender, EventArgs e) { // 单选场景走原有默认绑定逻辑即可 if (dgvMain.SelectedRows.Count <= 1) return; // 从已有的绑定配置中自动获取绑定的列名,无需硬编码 var textBinding = txtData.DataBindings[nameof(TextBox.Text)]; if (textBinding == null) return; string targetColumn = textBinding.BindingMemberInfo.BindingField; object newValue = txtData.Text; // 遍历所有选中行批量赋值 foreach (DataGridViewRow row in dgvMain.SelectedRows) { // 跳过DataGridView的空白新增行(如果开启了允许用户添加行功能需要保留该判断) if (row.IsNewRow) continue; if (row.DataBoundItem is DataRowView drv) { drv[targetColumn] = newValue; } } }
注意事项
- 赋值操作直接作用于绑定的
DataRowView,会自动同步到对应的DataTable和DataGridView UI,无需额外调用刷新方法 - 该方案完全兼容原有单选场景的绑定逻辑,无侵入性
- 若绑定的列不是字符串类型,可根据实际类型对
newValue做对应类型转换即可
内容的提问来源于stack exchange,提问作者Jason Mills
相关产品推荐
相关产品推荐

