0

我有一个从数据库填充的数据表。我用那个表加载了一个绑定源。

Sub LoadData()

Dim bsTemp As BindingSource = New BindingSource
bsTemp.DataSource = dtTemp

End Sub

然后我有其他代码以编程方式编辑数据表中的值。我从不打电话给 AcceptChanges() ..让我永远不要说清楚。

我确实调用了 bsTem.EndEdit() 并且每当我对其进行更改时,我也会在我的 dtTemp.Row(x).EndEdit() 上调用它。

所以现在我要做的就是比较两行(我知道我可以为每一列做这个,但我不想这样做。)

我想知道如何使这项工作:

Dim modview As New DataView(dtTemp.Copy, "", "Id", DataViewRowState.ModifiedCurrent)

Dim origView As New DataView(dtTemp.Copy, "", "Id", DataViewRowState.ModifiedOriginal)

所以我可以执行如下操作:

    Dim rowComparer As DataRowComparer(Of DataRow) = DataRowComparer.Default

    IsEqual = rowComparer.Equals(origRow.Row, modRow.Row)

当我这样做时,两个视图都显示修改后的数据,其中一个应该只显示原始未修改行。

我知道我可以做到这一点 [C# 版本]:

SomeDataRow[0, DataRowVersion.Original] //by index
SomeDataRow["ColumnName", DataRowVersion.Original]

但是 tis 还是在逐列的基础上工作 - 我是迭代器 - 当 DataView 据说内置了这个时,我认为没有理由这样做。那么我做错了什么,我没有看到原始版本。

4

1 回答 1

0

New DataView(..)不确定要复制哪些行,它只说明行在视图中之后的状态。您的第一个参数说明了哪些行dtTemp.Copy

由于数据表的copy方法是所有行的副本,因此您可能希望使用类似方法的select方法,它允许您根据状态进行过滤。

dtTemp.Select("","",ModifiedOriginal)

编辑:

以这种方式获得它一定有问题。根据MSDN给出的示例,如果您使用DataView.RowStateFilter. 我测试了它,它确实有效。我认为关键是DataView控制你所看到的。如果您通过 来查看原始数据DataRow,它始终是最新的。

于 2016-10-19T22:51:29.550 回答