DataRow.RejectChanges Throwing RowNotInTableException

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

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

В обработчике кнопок я хочу вернуть строки в 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()

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

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

1 ответ

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

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

Решение состоит в том, чтобы позвонить:

myGridView.CancelUpdateCurrentRow();

перед циклом по строкам DataView.

Другие вопросы по тегам