Как получить исходную строку и измененную строку DataRowView с помощью DataRowViewVersion

#c# #vb.net #datatable #version #datarowview

#c# #vb.net #datatable #версия #datarowview

Вопрос:

У меня есть datatable, который заполняется из базы данных. Я загружаю bindingsource с этой таблицей.

 Sub LoadData()

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

End Sub
  

Затем у меня есть другой код, программно редактирующий значения в datatable. Я НИКОГДА НЕ вызываю AcceptChanges() .. позвольте мне прояснить НИКОГДА.

Я вызываю bsTem.EndEdit() и я также вызываю это в моем dtTemp.Row(x).EndEdit() Всякий раз, когда я вношу в нее изменения.

Итак, теперь все, что я хочу сделать, это сравнить две строки (я знаю, что могу сделать это с помощью 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 предположительно имеет это встроенное.
Итак, что я мог делать не так, что я не вижу исходную версию.

Ответ №1:

New DataView(..) не определяет, какие строки копировать, он только говорит, какое состояние строк после того, как они будут в представлении. Ваш первый параметр указывает, какие строки dtTemp.Copy .

Поскольку copy метод datatable является копией всех строк, вы можете захотеть использовать что-то вроде select метода, который позволяет фильтровать на основе состояния.

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

Редактировать:

Должно быть, проблема с получением этого таким образом. Согласно примеру, приведенному из MSDN, это должно сработать, если вы используете DataView.RowStateFilter . Я протестировал это, и это сработало. Я думаю, ключ в том, что DataView контролирует то, что вы видите. Если вы посмотрите на необработанные данные через DataRow , они всегда актуальны.

Комментарии:

1. Это кажется странным, но это также обеспечивает то же самое — я вижу только измененную строку, но не исходную строку — но если я выполню это SomeDataRow(«myColumnName», DataRowVersion. Оригинал) Я получаю исходное значение для столбца! Что происходит?

2. Я создал тест, и у меня это не сработало. Итак, я последовал примеру MS, и это сработало, если вы используете RowStateFilter в DataView. Смотрите этот пример: msdn.microsoft.com/en-us/library /…

3. это пример, который я использовал, и когда я проверяю, я вижу, что он фильтрует строки, но когда вы смотрите на фактические значения в этих строках — все эти фильтры будут показывать измененный столбец с измененным значением, а не неизмененное значение или иным образом. Для этого я должен перейти к объекту row и столбцу и запросить DataRowVersion, чтобы получить эту версию (столбец за столбцом для каждой строки. Быстрый вопрос — вы видите то же самое в своем. Я нахожусь на win7 pro 64.NET4.0, я просматриваю значения в определителе VS 2015 CE.

4. Когда я запускаю пример, как есть, я получаю значения, которые вы ожидаете получить. Существует разница между 2 строками кода при отладке программы. dataTable.Rows(1)("dataColumn") и dataView(1)("dataColumn") . Первый обращается к RowsCollection, который покажет текущее значение, второй обращается к DataRowViewCollection, который показывает вам исходное значение. Это работает, просто не так, как вы (или я) думаете, что это должно быть.