我用DataTable的DataRow.Delete方法從表中刪除一行時,界面是自動更新了(移除了剛纔刪除的行),DataRow.Count減了1,但是這時再次循環訪問該DataTable,則拋出“不能通過已刪除的行訪問。。。”異常。在調試狀態下查看DataTable刪除操作後的數據顯示,剛纔刪除行的位置確實沒有數據,但該行並沒有真正的刪除,仍然佔據着位置,所以再次循環訪問到這行的時候會拋出異常。
用於從 DataTable 對象中刪除 DataRow 對象的方法有兩種:DataRowCollection 對象的 Remove 方法和 DataRow 對象的 Delete 方法。Remove 方法從 DataRowCollection 中刪除 DataRow,而 Delete 方法只將行標記爲刪除。當應用程序調用 AcceptChanges 方法時,纔會發生實際的刪除。通過使用 Delete,您可以在實際刪除之前先以編程方式檢查哪些行標記爲刪除。如果將行標記爲刪除,其 RowState 屬性會設置爲 Deleted。
在將 DataSet 或 DataTable 與 DataAdapter 和關係型數據源一起使用時,用 DataRow 的 Delete 方法移除行。Delete 方法只是在 DataSet 或 DataTable 中將行標記爲 Deleted,而不會移除它。而 DataAdapter 在遇到標記爲 Deleted 的行時,會執行其 DeleteCommand 方法以在數據源中刪除該行。然後,就可以用 AcceptChanges 方法永久移除該行。如果使用 Remove 刪除該行,則該行將從表中完全移除,但 DataAdapter 不會在數據源中刪除該行。
{
// Create a simple DataTable with two columns and ten rows.
DataTable table = new DataTable("table");
DataColumn idColumn = new DataColumn("id",
Type.GetType("System.Int32"));
idColumn.AutoIncrement=true;
DataColumn itemColumn = new DataColumn("item",
Type.GetType("System.String"));
table.Columns.Add(idColumn);
table.Columns.Add(itemColumn);
// Add ten rows.
DataRow newRow;
for(int i = 0; i <10; i++)
{
newRow = table.NewRow();
newRow["item"] = "Item " + i;
table.Rows.Add(newRow);
}
table.AcceptChanges();
DataRowCollection itemColumns = table.Rows;
itemColumns[0].Delete();
itemColumns[2].Delete();
itemColumns[3].Delete();
itemColumns[5].Delete();
Console.WriteLine(itemColumns[3].RowState.ToString());
// Reject changes on one deletion.
itemColumns[3].RejectChanges();
// Change the value of the column so it stands out.
itemColumns[3]["item"] = "Deleted, Undeleted, Edited";
// Accept changes on others.
table.AcceptChanges();
// Print the remaining row values.
foreach(DataRow row in table.Rows)
{
Console.WriteLine(row[0] + "/table" + row[1]);
}
}