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
反映了它们之间的关系。如果没有原始数据但有当前数据,则 RowState
为 Added
。正如@Plutonix 所说,对当前数据进行再多的编辑都不会添加原始数据,因此即使您进行进一步更改,RowState
仍然是 Added
。如果没有当前数据但有原始数据,则 RowState
为 Deleted
。如果当前数据与原始数据匹配则 RowState
为 Unchanged
,否则为 Modified
.
当您在数据适配器或 table 适配器上调用 Update
时,对每个 Added
行执行 InsertCommand
,执行 UpdateCommand
对于每个 Modified
行,对每个 Deleted
行执行 DeleteCommand
。成功保存后,适配器隐式调用 AcceptChanges
。这将从 DataTable
中删除所有 Deleted
行,并将 Added
和 Modified
行中的当前值复制到原始值之上,将 RowState
更改为 Unchanged
.
因此,RowState
用于跟踪自上次保存到数据库以来的更改。您不能使用它来确定用户是否在 UI 中进行了任何更改,除非您在每次编辑后将这些更改保存到数据库中。如果你想要更细粒度的更改跟踪,那么你必须自己实现它。就个人而言,在这些情况下我不绑定,而是等到用户单击“确定”将数据推送到 DataRow
。这也允许您取消最新的编辑而不会丢失之前的编辑。
我保证我已经看过无数声称同样问题的帖子,所以请原谅我仍然感到困惑。
我有一个包含强类型数据集的 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
反映了它们之间的关系。如果没有原始数据但有当前数据,则 RowState
为 Added
。正如@Plutonix 所说,对当前数据进行再多的编辑都不会添加原始数据,因此即使您进行进一步更改,RowState
仍然是 Added
。如果没有当前数据但有原始数据,则 RowState
为 Deleted
。如果当前数据与原始数据匹配则 RowState
为 Unchanged
,否则为 Modified
.
当您在数据适配器或 table 适配器上调用 Update
时,对每个 Added
行执行 InsertCommand
,执行 UpdateCommand
对于每个 Modified
行,对每个 Deleted
行执行 DeleteCommand
。成功保存后,适配器隐式调用 AcceptChanges
。这将从 DataTable
中删除所有 Deleted
行,并将 Added
和 Modified
行中的当前值复制到原始值之上,将 RowState
更改为 Unchanged
.
因此,RowState
用于跟踪自上次保存到数据库以来的更改。您不能使用它来确定用户是否在 UI 中进行了任何更改,除非您在每次编辑后将这些更改保存到数据库中。如果你想要更细粒度的更改跟踪,那么你必须自己实现它。就个人而言,在这些情况下我不绑定,而是等到用户单击“确定”将数据推送到 DataRow
。这也允许您取消最新的编辑而不会丢失之前的编辑。