寫的一個控件DataGridEX,繼承與DataGridView,其有3個核心函數:
getInsertList(),獲取新增行記錄集合
getUpdateList(),獲取更新行記錄集合
getDeleteList(),獲取刪除行記錄集合
最近,程序在運行過程中突然報錯“不能通過已刪除的行訪問該行的信息”,網上google了下,這個問題還挺多,眾說紛紜,個人感覺都沒有一個清晰的解決方案。
原因分析:
造成datatable的“不能通過已刪除的行訪問該行的信息”原因其實很簡單,程序在讀取已被刪除的行記錄信息。假設datatable原有4條記錄,刪除后2條記錄,現在做如下讀取操作:
//_table,為DataTable
int rowcount = this._table.Rows.Count;
for (int i = 0; i < rowcount; i++)
{
String status = (String)_table.Rows[i][“status”]; //讀取該行的狀態信息
}
正常情況下上述代碼可以成功執行,單是有時讀取到的rowcount值還是4,即被刪除的2條記錄還是可以讀取到,這時讀取第3、4條記錄_table.Rows[i][“status”]時就會報“不能通過已刪除的行訪問該行的信息”錯,因為這2條記錄已經被刪除。
解決方案:
1)追蹤c#為何通過_table.Rows.Count還可以讀取到被刪除的記錄數,根據這些原因我們在程序代碼里一一予以排除;
2)讀取_table.Rows[i][“status”]信息時,先判斷該條記錄是否已經被刪除。
由於1)方案我們很難去追蹤在哪些情況下還可以讀取到被刪除的記錄,因此建議使用2)方案,即不會出錯,有簡單。
使用2)方案修改后的讀取代碼如下:
//_table,為DataTable
int rowcount = this._table.Rows.Count;
for (int i = 0; i < rowcount; i++)
{
//跳過被刪除的記錄
if (this._table.Rows[i].RowState == DataRowState.Deleted)
continue;
String status = (String)_table.Rows[i][“status”]; //讀取該行的狀態信息
}
原文地址: http://blog.csdn.net/chuangxin/article/details/5844583