VB.net DataRow.RowState 不会更新

VB.net DataRow.RowState will not update

我保证我已经看过无数声称同样问题的帖子,所以请原谅我仍然感到困惑。

我有一个包含强类型数据集的 VS2008 智能设备项目。允许用户输入值并保存它们,每次都在数据集中创建一条新记录。如果用户希望编辑值,将显示一个模态子窗体,其中包含几个组合框,其中包含用于编辑行的可接受输入的可能值。每个组合框都按以下方式绑定在子窗体的构造函数中:

With cmbSize
        .DataSource = frmMain.dstConfig.Sizes
        .DisplayMember = "Display"
        .ValueMember = "Value"
        .DataBindings.Add("SelectedValue", trowNewRow, "SIZE", True, DataSourceUpdateMode.OnPropertyChanged)
End With

dstConfig 是包含约束的表的数据集。绑定到源的显示和值成员工作正常。

trowNewRow 是对数据集中行的引用,当用户启动编辑过程时,通过将行作为参数传递给子表单 "ByRef" 从主窗体传送到子窗体。强类型被保留。我突然想到可能存在某种我不知道何时发生的断开连接。我通过对数据集执行 "Select" 过程并通过与要编辑的行相对应的唯一 ID 字段进行过滤来传递引用。结果是一个单项数组,其中包含与数据集相同模式的强类型行,我从中传递第一个(也是唯一一个)项作为我的对象。

在用户通过单击“确定”按钮提交更改后,将触发一个过程来评估是否实际执行了更改。我认为最好的方法是检查 trowNewRow 的 RowState。但是,无论更改如何,RowState 都保持 "Added"。手动检查该行的值表明更改确实已被记录。我已经验证了 trowNewRow 的 AcceptChanges 过程没有被我的任何代码明确调用。

我试过以下方法: 1.) 调用 trowNewRow 的 EndEdit 过程 2.) 在组合框上手动执行 WriteValue 3.) 在组合框的 BindingManagerBase 对象上调用 EndCurrentEdit 过程 4.)以上每一个组合

提前感谢您提供任何想法或解决方案。

A DataRow 包含两组数据 - 原始数据和当前数据 - RowState 反映了它们之间的关系。如果没有原始数据但有当前数据,则 RowStateAdded。正如@Plutonix 所说,对当前数据进行再多的编辑都不会添加原始数据,因此即使您进行进一步更改,RowState 仍然是 Added。如果没有当前数据但有原始数据,则 RowStateDeleted。如果当前数据与原始数据匹配则 RowStateUnchanged,否则为 Modified.

当您在数据适配器或 table 适配器上调用 Update 时,对每个 Added 行执行 InsertCommand,执行 UpdateCommand对于每个 Modified 行,对每个 Deleted 行执行 DeleteCommand。成功保存后,适配器隐式调用 AcceptChanges。这将从 DataTable 中删除所有 Deleted 行,并将 AddedModified 行中的当前值复制到原始值之上,将 RowState 更改为 Unchanged.

因此,RowState 用于跟踪自上次保存到数据库以来的更改。您不能使用它来确定用户是否在 UI 中进行了任何更改,除非您在每次编辑后将这些更改保存到数据库中。如果你想要更细粒度的更改跟踪,那么你必须自己实现它。就个人而言,在这些情况下我不绑定,而是等到用户单击“确定”将数据推送到 DataRow。这也允许您取消最新的编辑而不会丢失之前的编辑。