2010-12-17 27 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