Delete使用是 datatable.Rows(i).Delete()
Remove使用是datatable.Rows.Remove(datatable.Rows(i))
兩者的區別是:
使用Delete后,只是該行被標記為deleted,記錄還存在的,用Rows.Count來獲取行數時,還是刪除之前的行數,要使刪除生效,需要使用datatable.AcceptChanges()方法來提交修改。
而Remove方法則是直接刪除, 如果是按某列為條件進行刪除,則每刪完一行,整個Table的index就會立即發生變化,等於Table已經變成了一個新的表。但是索引卻已經加1了。
於是會造成第一列永遠匹配不到。因此,每刪除完一行,要跟着判斷第一行是否滿足刪除條件。
所以在循環刪除一個datatable中的行的時候,每刪除一行,DataTable中所有行的索引都會發生改變。如果使用foreach遍歷DataTable循環刪除或者是使用for語句正序遍歷DataTable循環刪除
就會拋出異常錯誤,這也是在循環刪除DataTable.Row的時候不能使用foreach的原因所在。使用foreach進行循環的時候,是不允許Table有刪除和添加操作的。
1,使用DataTable.Rows.Remove(DataRow),或者DataTable.Rows.RemoveAt(index);可以直接刪除行,循環刪除可以采用for倒序循環DataTable.Rows
2,datatable.Rows[i].Delete()。Delete()之后需要datatable.AccepteChanges()方法確認完全刪除,因為Delete()只是將相應列的狀態標志為刪除,還可以通過datatable.RejectChanges()回滾,使該行取消刪除。
如果要使用Remove刪除DataTable中的多行,應該采用倒序循環DataTable.Rows。因為正序刪除時索引會發生變化。程式發生異常,很難預料后果。
For i As Integer = dt.Rows.Count - 1 To 0 Step -1 'dt.Rows.Remove(dt.Rows(i)) dt.Rows.RemoveAt(i) Next