實際使用
//循環DataTable,刪除數據 for(int i = dtPreview.Rows.Count - 1; i >= 0; i--) { if(listSelected.Contains(i)) { dtPreview.Rows[i].Delete(); } } dtPreview.AcceptChanges();
說明
即使使用的是Rows[i].Delete();方法,仍然有問題。
調試時發現執行玩Delete()方法,就會把DataTable中的數據刪除掉,導致dtPreview.Rows.Count的值一直在變化。
所以倒着循環,從最大的索引開始刪除,這樣刪除后,被刪除索引前面的索引不會發生變化。
網上百度的結果
//一般情況下我們會這么刪除 DataTable dt = new DataTable(); for(int i = 0; i < dt.Rows.Count; i++) { if(99 % i == 0) { dt.Rows.RemoveAt(i); } } //但是這么刪除會出現意外情況 //當運行dt.Rows.RemoveAt(i)代碼后DataTable的index會發生改變 //且他的dt.Rows.Count也會改變 //正確做法一 for(int i = dt.Rows.Count - 1; i >= 0; i--) { if(99 % i == 0) { dt.Rows.RemoveAt(i); } } //正確做法二 for(int i = 0; i < dt.Rows.Count; i++) { if(99 % i == 0) { dt.Rows[i].Delete(); } } dt.AcceptChanges(); //提交 //dt.RejectChanges();//回滾
