我有一个从数据库填充的数据表。我用这个表加载了一个bindingsource。
Sub LoadData()
Dim bsTemp As BindingSource = New BindingSource
bsTemp.DataSource = dtTemp
End Sub
然后,我用其他代码以编程方式编辑数据表中的值。我从不调用AcceptChanges() ..让我明确一点,绝不。
我调用bstem . enddit(),我也调用我的dtTemp.Row(x). enddit()每当我改变它。
所以现在我要做的就是比较这两行(我知道我可以对每一列都使用a,但我不想这样做)
我想知道如何做到这一点:
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]
但是这又是在逐列的基础上工作的-我是迭代器-我认为没有理由这样做,当DataView应该已经内置了这个。所以我做错了什么,我没有看到原始版本。
New DataView(..)
不确定要复制哪些行,它只说明这些行在视图中之后的状态。第一个参数表示哪几行是dtTemp.Copy
。
由于数据表的copy
方法是所有行的副本,您可能希望使用类似select
方法的东西,它允许您基于状态进行过滤。
dtTemp.Select("","",ModifiedOriginal)
编辑:这样做肯定有问题。根据MSDN给出的示例,如果您使用DataView.RowStateFilter
,它应该工作。我测试了一下,确实有效。我认为关键是DataView
控制你所看到的。如果您通过DataRow
查看原始数据,它始终是当前的。