实际使用
//循环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();//回滚