我有一个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()
这不是我预期的行为。我希望它只是从数据表中删除这一行,一切都会很酷。
关于如何获得我正在寻找的行为的任何想法?
答案 0 :(得分:0)
原来这是DevExpress Grid的一个特点。
当我说用户点击复选标记发布他们的更改时,我错了。那个案子很好用。当他们不单击复选标记以保存新行并单击取消时会出现问题。
解决方案是致电:
myGridView.CancelUpdateCurrentRow();
在循环访问DataView的行之前。