VB.net DataRow.RowState将不会更新
我保证,我已经看过了无数的帖子,声称同样的问题,所以请原谅我,我仍然感到困惑 我有一个VS2008智能设备项目,其中包含一个强类型数据集。每次在数据集中创建新记录时,允许用户输入值并保存它们。如果用户希望编辑值,将显示一个模式子窗体,其中包含多个组合框,其中包含可接受输入的可能值,以编辑行。每个组合框都以以下方式绑定到子窗体的构造函数中: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
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
中。这还允许您取消最新的编辑,而不会丢失以前的编辑。替换这两个长段落的相关代码可能会更好地说明问题并减少繁琐。如果吵闹