從 DataTable 對象中刪除 DataRow 對象 遇到的問題

我用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 不會在數據源中刪除該行。

private void DemonstrateDeleteRow()
{
    
// 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]);
    }

}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章