VB.net DataRow.RowState将不会更新

VB.net DataRow.RowState将不会更新,vb.net,data-binding,visual-studio-2008,strongly-typed-dataset,smart-device,Vb.net,Data Binding,Visual Studio 2008,Strongly Typed Dataset,Smart Device,我保证,我已经看过了无数的帖子,声称同样的问题,所以请原谅我,我仍然感到困惑 我有一个VS2008智能设备项目,其中包含一个强类型数据集。每次在数据集中创建新记录时,允许用户输入值并保存它们。如果用户希望编辑值,将显示一个模式子窗体,其中包含多个组合框,其中包含可接受输入的可能值,以编辑行。每个组合框都以以下方式绑定到子窗体的构造函数中: With cmbSize .DataSource = frmMain.dstConfig.Sizes .DisplayMemb

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

我有一个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。但是,无论更改如何,行状态都保持“已添加”。手动检查行的值表明更改确实已被记录。我已经验证了trowNewRow的AcceptChanges过程没有被我的任何代码显式调用

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


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

A
DataRow
包含两组数据-原始数据和当前数据-
RowState
反映了它们之间的关系。如果没有原始数据,但有当前数据,则添加
行状态
。正如@puropoix所说,对当前数据的任何编辑都不会添加原始数据,因此即使您进行进一步更改,
RowState
仍将保持
Added
。如果没有当前数据,但有原始数据,则
行状态
删除
。如果当前数据与原始数据匹配,则
行状态
未更改
,否则为
已修改

在数据适配器或表适配器上调用
Update
时,会对每个添加的
行执行
InsertCommand
,对每个修改的
行执行
UpdateCommand
,对每个删除的
行执行
delete命令。成功保存后,适配器隐式调用
AcceptChanges
。这将从
数据表中删除所有
已删除的
,并将
已添加的
已修改的
行中的当前值复制到原始值上,从而将
行状态
更改为
未更改的


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

数据行包含两组数据-原始数据和当前数据,
行状态反映了它们之间的关系。如果没有原始数据,但有当前数据,则添加
行状态
。正如@puropoix所说,对当前数据的任何编辑都不会添加原始数据,因此即使您进行进一步更改,
RowState
仍将保持
Added
。如果没有当前数据,但有原始数据,则
行状态
删除
。如果当前数据与原始数据匹配,则
行状态
未更改
,否则为
已修改

在数据适配器或表适配器上调用
Update
时,会对每个添加的
行执行
InsertCommand
,对每个修改的
行执行
UpdateCommand
,对每个删除的
行执行
delete命令。成功保存后,适配器隐式调用
AcceptChanges
。这将从
数据表中删除所有
已删除的
,并将
已添加的
已修改的
行中的当前值复制到原始值上,从而将
行状态
更改为
未更改的


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

替换这两个长段落的相关代码可能会更好地说明问题并减少繁琐。如果吵闹