# C# 的DataTable 绑定组件修改后,通过 `GetChanges()` 无法获取修改后的 DataTable

场景描述

在使用 C# 开发的某个界面中,左侧的 DataGridView 绑定了一个 DataTable 的部分字段,右侧的 TextBox 也绑定了同一个 DataTable 的部分字段。这样,一个 DataTable 的行数据被分布绑定在左侧和右侧。

当在右侧的 TextBox 中随意修改某个字段的值后,直接调用 dt.GetChanges() 方法,却发现返回的结果为 null,即修改未被检测到。

问题原因

经过多次调试发现,问题并不是一直存在,而是具有以下特征:

  • 有时可以获取到修改的数据,调用 GetChanges() 返回正确结果。
  • 有时无法获取修改的数据,调用 GetChanges() 返回 null

这是因为当 DataTable 绑定的一行数据处于编辑状态时,编辑还未结束,DataTable 并未记录修改。

只有当焦点移开编辑控件(如 TextBox),该行的编辑状态才会自动结束,修改才会被记录到 DataTable 中。否则,需手动调用接口结束编辑。

解决方案

为了确保在调用 GetChanges() 时,DataTable 中的编辑状态已经结束,建议通过以下方法解决。

绑定控件数据的代码实现

private BindingSource bindingSource = new BindingSource();

private void BindControls()
{
    // 将 DataTable 绑定到 BindingSource
    bindingSource.DataSource = dt;
    dataGridView5.DataSource = bindingSource;

    // 绑定 TextBox
    textBox1.DataBindings.Clear();
    textBox2.DataBindings.Clear();
    textBox3.DataBindings.Clear();
    textBox1.DataBindings.Add("Text", bindingSource, "str1");
    textBox2.DataBindings.Add("Text", bindingSource, "str2");
    textBox3.DataBindings.Add("Text", bindingSource, "str3");
}

调用GetChanges前结束编辑

// 在调用 GetChanges() 之前,显式结束绑定控件的编辑状态
bindingSource.EndEdit();
DataTable dtChanges = dt.GetChanges();
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

清酒半生

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值