DataRow.RejectChanges抛出RowNotInTableException

时间:2015-07-10 19:19:07

标签: c# winforms datatable devexpress-windows-ui

我有一个DataTable和一个Grid(实际上是一个DevExpress Winforms XtraGrid)。我在表上创建了一个DataView,它是其行的子集。此DataView是网格的数据源。

用户在网格中键入新行并发布更改(单击网格的复选标记)。然后他们决定通过单击取消按钮(在我的表单上)来恢复所有更改。

在按钮处理程序中,我想将DataView中的行恢复为原始状态。我不想还原DataTable中的所有行。

我查看DataView的行,拒绝每行的更改,例如:

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

这适用于还原更新。但是,如果用户在网格中插入了新行,则会出现异常:调用RejectChanges时抛出System.Data.RowNotInTableException。以下是异常的堆栈跟踪:

   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 个答案:

答案 0 :(得分:0)

原来这是DevExpress Grid的一个特点。

当我说用户点击复选标记发布他们的更改时,我错了。那个案子很好用。当他们不单击复选标记以保存新行并单击取消时会出现问题。

解决方案是致电:

myGridView.CancelUpdateCurrentRow();

在循环访问DataView的行之前。