2015-07-10 8 views
1

У меня есть DataTable и Grid (на самом деле DevExpress Winforms XtraGrid). Я создаю DataView в таблице, которая является подмножеством ее строк. Этот DataView является источником данных сетки.DataRow.RejectChanges Throwing RowNotInTableException

Пользователь вводит новую строку в сетку и публикует изменения (щелкает галочкой для сетки). Затем они решают, что хотят вернуть все свои изменения, нажав кнопку отмены (в моей форме).

В обработчике кнопок я хочу вернуть строки в DataView в исходное состояние. Я не хочу возвращать все строки в DataTable.

Я смотрю через строки DataView, отвергая изменения в каждой строке, например:

foreach (DataRowView drv in myDV) 
    { 
     MyTableRow row = (MyTableRow)drv.Row; 
     row.RejectChanges(); 
    } 

Это прекрасно работает для обновления возвращаясь. Однако, если пользователь вставил новую строку в сетку, я получаю исключение: System.Data.RowNotInTableException, которое вызывается при вызове RejectChanges. Вот трассировка стека к исключению:

at System.Data.DataRow.GetDefaultRecord() 
    at System.Data.DataColumn.CheckNullable(DataRow row) 
    at System.Data.DataTable.RaiseRowChanging(DataRowChangeEventArgs args, DataRow eRow, DataRowAction eAction, Boolean fireEvent) 
    at System.Data.DataTable.SetNewRecordWorker(DataRow row, Int32 proposedRecord, DataRowAction action, Boolean isInMerge, Boolean suppressEnsurePropertyChanged, Int32 position, Boolean fireEvent, Exception& deferredException) 
    at System.Data.DataRow.RejectChanges() 

Это не то поведение, которое я ожидал. Я ожидал, что он просто удалит эту строку из datatable, и все будет круто.

Любые мысли о том, как получить поведение, которое я ищу?

+0

Почему люди продолжают использовать нетипизированный материал 'DataTable' из pre-generics .Net 1.1? –

ответ

0

Оказывается, это особенность сетки DevExpress.

Я ошибся, когда сказал, что пользователь щелкнул галочкой, чтобы опубликовать их изменения. Этот случай отлично работает. Проблема возникает, когда они НЕ нажимают галочку, чтобы сохранить новую строку, и нажмите «Отмена».

Решение назвать:

myGridView.CancelUpdateCurrentRow(); 

перед циклом через ряды в DataView в.

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

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