2013-10-22 62 views
2

DataTable的DT數據表刪除行和AcceptChanges的

num  type name 
=================================== 
001  A  Peter 
002  A  Sam 
003  B  John 

public static void fun1(ref DataTable DT, String TargetType) 
{ 
    for (int i = 0; i < DT.Rows.Count; i++) 
    { 
     string type = DT.Rows[i]["type"]; 

     if (type == TargetType) 
     { 
      /**Do Something**/ 
      DT.Rows[i].Delete(); 
     } 
    } 
    DT.AcceptChanges(); 
} 

我的功能得到具體的數據行。讀取數據行(匹配目標類型)後,它將被刪除。

但是,該行在執行.Delete()後立即刪除,因此下一行(由i)的位置不正確。

例如,如果TargetType是A.當i = 0時,執行.Delete後刪除「Peter」行。然後,當我= 1,我想它會找到「山姆」行,但它實際上位於「約翰」行,因爲「彼得」行被刪除。

我的代碼有問題嗎?

+0

我認爲當鍵入== TargetType並刪除該行時,您應該將i的值減1,以便當它刪除i = 0時,1 = 1處的行移動到i = 0,然後它會檢查並刪除該行,如果在i = 0時刪除行然後遞減,則應該設置i = 0的值,您還需要再檢查一次。 –

回答

2

不,刪除方法不會刪除Rows集合中的行。它標記爲DeletedRowState。在致電AcceptChanges後,該行將從DataTable的集合中刪除。
因此,內正常的循環沒有對元素的個數沒有副作用

但是,請記住:

通話完畢後,刪除任何類型的訪問,現在已刪除的行會提高一個例外。

DT.Rows[i].Delete(); 
string test = DT.Rows[i][0].ToString(); // Will raise an exception 

,並根據MSDN,與foreach循環刪除它裏面將觸發異常

DataRow.RowState
DataRow.Delete

1

雅,有一個問題你碼。您應該在for循環之前調用DT.AcceptChanges()方法。它會將所有行的行狀態從Added更改爲Unchanged。現在,如果您調用Delete方法,它將不會從數據表中刪除它,直到您調用AcceptChanges方法,並且您的索引將保持不變並且不指向下一行。

如果該行的RowState爲Added,則RowState將變爲Detached,並且在調用AcceptChanges時該行將從表中刪除。