2016-10-19 7 views
0

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

Sub LoadData() 

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

End Sub 

У меня тогда есть другой код, программно редактирующий значения в datatable. Я НИКОГДА не называю 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) 

Когда я делаю это оба мнения показывают измененные данные, один из них должен только показать мне оригинал неизмененной Row.

Я знаю, что могу это сделать [C# версия]:

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

Но опять тис работы на колонке на колонке основе - я, будучи итератор - и я не вижу никаких причин, чтобы сделать это, когда DataView якобы имеет этот встроенный. Так что я могу делать неправильно, что не вижу оригинальной версии.

ответ

0

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

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

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

EDIT:

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

+0

Кажется странным, но это также дает то же самое - я вижу только измененную строку, но не исходную строку, но если я выполню этот SomeDataRow («myColumnName», DataRowVersion.Original), я получаю исходное значение для столбца! Что происходит? – Ken

+0

Я создал тест, и это не сработало для меня. Поэтому я последовал примеру MS и работал, если вы используете 'RowStateFilter' в DataView. См. Этот пример: https://msdn.microsoft.com/en-us/library/system.data.dataviewrowstate(v=vs.110).aspx – Steve

+0

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

 Смежные вопросы

  • Нет связанных вопросов^_^