2015-07-10 62 views
1

我有一個DataTable和一個網格(實際上是一個DevExpress Winforms XtraGrid)。我在作爲其行的子集的表上創建DataView。這個DataView是網格的數據源。DataRow.RejectChanges拋出RowNotInTableException異常

用戶在網格中鍵入新行併發布更改(單擊網格的複選標記)。然後他們決定通過點擊取消按鈕(在我的表單上)來恢復他們的所有更改。

在按鈕處理程序中,我想將DataView中的行恢復爲其原始狀態。我不想恢復DataTable中的所有行。

我通過數據視圖的列一下,拒絕在每行的變化,如:

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

爲什麼人們繼續使用來自pre-generics .Net 1.1的無類型的'DataTable'? –

回答

0

原來,這是DevExpress Grid的一個特點。

我說錯了,當我說用戶點擊複選標記發佈他們的更改。這種情況很好。當他們不單擊複選標記以保存新行並單擊取消時,會出現問題。

解決的辦法是撥打:

myGridView.CancelUpdateCurrentRow(); 

通過數據視圖的行循環之前。