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.