最近做東西,用到需要把一個datatbale的數據分爲符合的和不符合的數據,但是一旦刪除某一行索引值就會發生改變,如果用循環去remove的話就會出現刪除
數據有誤了,改用datatable.Rows[i].Delete()可解決問題。下面爲代碼示例:
for (int i = 0; i <= ArrDeleteRowNo.Length - 1; i++)
{
int arraa = ArrDeleteRowNo.Length;//用數組記錄要刪除的位置行數
DT_Query.Rows[ArrDeleteRowNo[i]].Delete();//記錄刪除位置
}
DT_Query.AcceptChanges();//提交刪除位置的改變
注意:
datatable.Rows[i].Delete()。Delete()之後需要datatable.AccepteChanges()方法確認完全刪除,因爲Delete()只是將相應列的狀態標誌爲刪除,還可以通過datatable.RejectChanges()回滾,使該行取消刪除。
另外在網上還看到以下的方法 第一個還沒有試過,先收藏...
在C#中,如果要刪除DataTable中的某一行,大約有以下幾種辦法:
1,使用DataTable.Rows.Remove(DataRow),或者DataTable.Rows.RemoveAt(index);可以直接刪除行
標註一下:DataTable.Rows.Remove(DataRow) 當改行被刪除以後,整個表的索引將重建,如果使用循環作爲dataRow的index訪問表格 則會出現錯誤,比如你要刪除的數據沒有刪除完;這是因爲 當你刪除了第八行,i++之後 訪問第九行數據,可是之前爲第九行的數據由於刪除了一行數據而爲而索引爲8 則訪問漏掉了一行數據。
這裏有我寫的一個例子,大家可以看看:
- for (int i = 0; i < history.Rows.Count; i++)//注意這裏一定要用Datatable的Rows.count 作爲循環條件終止的值,而不能用 一個定值,因爲每當刪除一條數據,表的行數會發生變化,訪問的下標則不會和未刪除之前的表一樣。
- {
- if (!((lngX < 135.549864 && lngX > 73.27112) && (latY > 17.714548 && latY < 52.971885)))
- {
- history.Rows.Remove(history.Rows[i]);
- i--;//刪除之後原來索引爲i+1 處的行索引會因爲刪去一行而變爲i ,i-- 確保此條數據不被漏掉
- }
- }
2,datatable.Rows[i].Delete()。Delete()之後需要datatable.AccepteChanges()方法確認完全刪除,因爲Delete()只是將相應列的狀態標誌爲刪除,還可以通過datatable.RejectChanges()回滾,使該行取消刪除。