#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, который показывает вам исходное значение. Это работает, просто не так, как вы (или я) думаете, что это должно быть.