0

我保证我已经看过声称这个问题的bazillion帖子,所以请原谅我,我仍然难倒。VB.net DataRow.RowState不会更新

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

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

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

trowNewRow是对用户启动编辑过程时从主窗体传递的数据集中的行的引用,通过将该行作为参数“ByRef”传递给子窗体。强打字被保存下来。在我看来,可能会出现某种断开,我不知道这种情况何时发生。我通过对数据集执行“选择”过程并通过与要编辑的行对应的唯一ID字段进行过滤来传递参考。结果是与数据集相同模式的强类型行的单项数组,其中第一个(也是唯一)项作为我的对象传递。

用户通过单击确定按钮提交更改后,会触发过程以评估是否实际执行了更改。我认为这样做的最好方法是检查trowNewRow的RowState。但是,无论更改如何,RowState都会保持“添加”状态。手动检查行的值表示更改确实已记录。我已验证trowNewRow的AcceptChanges过程没有被我的任何代码明确地调用。

我曾尝试以下: 1)调用trowNewRow 的EndEdit中方法2)手动执行上调用的组合框BindingManagerBase的EndCurrentEdit过程的组合框 3.)一个WriteValue对象 4。 )上述各项组合

预先感谢您的任何想法或解决方案。

+1

代替这两个长段落的相关代码可能会更好地说明问题并减少乏味。如果行状态是已添加,则表示dataadapter尚未更新数据库。由于它是一个新的行,所以在你保存之前它仍然是一个新的行(不管有多少编辑/改变)。 – Plutonix

回答

1

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

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

因此,RowState用于跟踪自上次保存到数据库以来的更改。除非每次编辑后都将这些更改保存到数据库,否则无法使用它来确定用户是否在UI中进行了任何更改。如果你想要更细致的变更跟踪,那么你必须自己实现它。就我个人而言,在这些情况下,我并没有约束,而是等到用户单击确定以将数据推送到DataRow。这也可以让你取消最新的编辑而不会丢失先前的编辑。