2010-12-17 54 views
1

我遇到了一個問題,試圖從C#中的數據表中刪除一行。問題在於數據表是從SQL構建的,所以它可以有任意數量的列,並且可能有或沒有主鍵。所以,我無法基於特定列或主鍵中的值刪除行。從C#中的通用數據表中刪除行

下面是我在做什麼的基本輪廓:

//Set up a new datatable that is an exact copy of the datatable from the SQL table. 
newData = data.Copy(); 
//...(do other things) 
foreach (DataRow dr in data.Rows) 
{ 
    //...(do other things) 
    // Check if the row is already in a data copy log. If so, we don't want it in the new datatable. 
    if (_DataCopyLogMaintenance.ContainedInDataCopyLog(dr)) 
    { 
    newData.Rows.Remove(dr); 
    } 
} 

但是,這給了我一個錯誤信息,「給定的DataRow是不是在當前DataRowCollection」。考慮到newData是數據的直接副本,這沒有任何意義。有沒有人有任何建議? MSDN網站沒有太大的幫助。

謝謝!

+2

是的,你有一個_copy_,但你沒有_that確切的row_。如果你想從newData中刪除一行,你必須引用它所包含的行,而不是來自另一個表的行(即使它是完全重複的,它仍然是不同的,不能用於刪除它來自newData的行)。 – 2010-12-17 16:48:26

回答

4

您的foreach需要在副本上,而不是原來的集合。您無法從collection2中刪除collection1中包含的對象。

foreach (DataRow dr in newData.Rows) 

否則,您可以使用計數器在索引處刪除。這樣的事情:

for(int i = 0; i < data.Rows.Count; i++) 
{ 
    if (_DataCopyLogMaintenance.ContainedInDataCopyLog(data.Rows[i])) 
    { 
    newData.Rows.RemoveAt(i); 
    } 
} 
+0

謝謝,這就是我所需要的。我從來沒有看到關於datatabe.copy()方法的任何警告,但它是有意義的,它只是一個副本,並沒有引用原始行。 – Greg 2010-12-17 18:16:25