修改行时 HasChanges() 始终为假,除非我调用表单的 BindingContext EndCurrentEdit() 方法

HasChanges() is always false when rows are modified unless I call the form's BindingContext EndCurrentEdit() method

所以我有一个 DataSet,我填充了它。出于测试目的,它包含一个 DataTable。这是从 return 是一个 SQL TABLE 的查询中填充的,它有两列,IDName。这个table里面有1条记录。

我有一个 TextBox,我按以下方式绑定:

Dim dv As System.Data.DataView = myDataSet.Tables("MyTable").AsDataView()
dv.RowFilter = "ID=1"

Dim dabi As New Binding("Text", dv, "Name") 
txtInput.DataBindings.Add(dabi)

这一切在应用程序中都非常有效! TextBox 使用 DataSet 中的值进行填充,当我在 TextBox.

中输入内容时,存储在 DataSet 中的值会更新

所以,我在TextBox中做了一个,然后我去保存它。

我叫myDataSet.HasChanges()。它 returns False,尽管我已经进行了更改。研究表明,这与不相信编辑是 'finished' 的行有关,但我不确定这一点,因为我无法找到关于这一切的良好信息来源正在工作。

我还发现如果我在调用 myDataSet.HasChanges() 与以下行:

Me.BindingContext(myDataSet.Tables("MyTable")).EndCurrentEdit()

这是为某种全局绑定上下文调用的方法。我没有对此做任何事情,也没有调用任何 'Begin Edit' 方法等(研究表明这些东西可能是私有的并被隐式调用)。

我的问题是:这是怎么回事?为什么 HasChanges() 需要这条线才能工作?我在我的数据绑定中做错了什么需要这条线吗?该行是否有任何潜在的不可预见的副作用?

编辑: HasChanges() 将正确 return 如果新行 添加 而不调用 EndCurrentEdit(),只有修改现有行时才会出现此问题。

调用EndCurrentEdit cause the changes which you made on an IEditableObject被保存到基础数据源。

自从 DataRowViewDataRowView implements IEditableObject, calling EndCurrentEdit of the currency manager cause EndEdit 被调用并提交对基础 DataRow 的更改并结束编辑会话。

此外,当您使用绑定源更改位置或通过单击另一行网格更改位置时,如果实际上您正在更改货币管理器的位置,则调用 EndCurrentEdit

所以要提交更改,您应该直接或间接调用 EndCurrentEdit