如何在button_click事件中修改DataTable选中行数量并同步更新DataGridView
实现方案
步骤1:调整BindingSource作用域
你当前在mainForm_Load中定义的SBind是局部变量,按钮点击事件中无法访问,需要调整为窗体类的全局成员:
在你的主窗体类内部、方法外声明:
// 窗体全局绑定源对象 private BindingSource _toolBindingSource;
然后修改mainForm_Load中的绑定源初始化代码,把原来的BindingSource SBind = new BindingSource();替换为:
_toolBindingSource = new BindingSource(); _toolBindingSource.DataSource = tooldataSet.Tables["Tool"];
对应的DataGridView绑定代码也要同步修改:
toolDataGridView.DataSource = _toolBindingSource;
步骤2:编写按钮点击事件逻辑
直接修改绑定源当前选中行对应的DataRow值即可,.NET的绑定机制会自动同步更新DataGridView和所有绑定到该数据源的文本框,不需要手动刷新控件:
private void updateQtyButton_Click(object sender, EventArgs e) { // 校验是否有选中行 if (_toolBindingSource.Current == null) { MessageBox.Show("请先选中要修改的工具行"); return; } // 获取选中行对应的DataRow DataRowView selectedRowView = (DataRowView)_toolBindingSource.Current; DataRow selectedRow = selectedRowView.Row; try { // 示例逻辑:将现有库存OnHand加1,可根据你的需求替换为自定义修改逻辑 // 如果要读取用户输入的数值,直接替换为Convert.ToInt32(你的输入框.Text)即可,建议提前加输入合法性校验 int currentOnHand = Convert.ToInt32(selectedRow["OnHand"]); selectedRow["OnHand"] = currentOnHand + 1; // 同步更新OrderQty,和你初始化的计算逻辑保持一致 int stockQty = Convert.ToInt32(selectedRow["StockQty"]); int updatedOnHand = Convert.ToInt32(selectedRow["OnHand"]); selectedRow["OrderQty"] = Math.Max(stockQty - updatedOnHand, 0); } catch (Exception ex) { MessageBox.Show($"修改数量失败:{ex.Message}"); } }
补充说明
- 所有绑定到该
_toolBindingSource的控件(包括DataGridView、你绑定的文本框)都会在DataRow值修改后自动同步更新,无需额外调用刷新方法。 - 如果需要将修改后的数据持久化回JSON文件,只需要遍历
tooldataSet.Tool的所有行,序列化为JSON后写入原文件即可。
内容的提问来源于stack exchange,提问作者Joe Fisher
相关产品推荐
相关产品推荐

