从一个DataTable复制行到另一个DataTable?

193
如何在C#中将特定行从DataTable复制到另一个DataTable?有多行。
15个回答

291
foreach (DataRow dr in dataTable1.Rows) {
    if (/* some condition */)
        dataTable2.Rows.Add(dr.ItemArray);
}

以上示例假设dataTable1dataTable2拥有相同数量、类型和顺序的列。


27
这样做会导致出现“此行已属于另一个表”的结果。 - McArthey
15
不会的;新的一行是由现有行中的值创建的。该行本身并未添加到其他 DataTable 中。 - Bradley Smith
21
只有在表达式结尾处省略ItemArray部分时才会发生那种情况。确保添加的是行的值而不是行本身。 - Bradley Smith
5
请参考 MSDN 文档中关于 DataTable.Clone 方法的说明:http://msdn.microsoft.com/zh-cn/library/system.data.datatable.clone.aspx。 - Bradley Smith
11
尽管您的答案在技术上是正确的,但您的代码示例并没有涉及到您的假设。@RageeshGr的答案涵盖了所有的假设,并且在我看来更加简洁,出错几率更低。 - chris.nesbit1
显示剩余11条评论

123

从一个表复制指定行到另一个表

// here dttablenew is a new Table  and dttableOld is table Which having the data 

dttableNew  = dttableOld.Clone();  

foreach (DataRow drtableOld in dttableOld.Rows)
{
   if (/*put some Condition */)
   {
      dtTableNew.ImportRow(drtableOld);
   }
}

如果我在导入后不再需要使用dttableOld,那么我是否仍然需要使用Clone()函数? - Sam
太棒了,非常实用!谢谢! - Mayer Spitz
2
@Sam 关于你的问题,Clone 是复制表结构,如果你的表已经是相同的数据类型,那么你就不需要它了。 - Mayer Spitz
有更好的方法来完成这个任务。entityColumnMetadata = changedColumnMetadata.AsEnumerable().Where(dataRow => entityName.Equals(dataRow["EntityName"])).CopyToDataTable(); - yuvraj
+1 很好的回答。值得指出的是,与 DataTable::Rows::Add(...) 相比,DataTable::ImportRow 在处理列的数量和顺序时更加宽容。如果导入的行中缺少某一列,则该值将被设置为 NULL。 - AlainD

23

试试这个

    String matchString="ID0001"//assuming we have to find rows having key=ID0001
    DataTable dtTarget = new DataTable();
    dtTarget = dtSource.Clone();
    DataRow[] rowsToCopy;
    rowsToCopy = dtSource.Select("key='" + matchString + "'");
    foreach (DataRow temp in rowsToCopy)
    {
        dtTarget.ImportRow(temp);
    }

@ManojSavalia,那么有没有不会影响性能的替代方案呢? - Sam

21

看一下这个,你可能会喜欢它(之前,请将table1克隆到table2):

table1.AsEnumerable().Take(recodCount).CopyToDataTable(table2,LoadOption.OverwriteChanges);
或:
table1.AsEnumerable().Where ( yourcondition  ) .CopyToDataTable(table2,LoadOption.OverwriteChanges);

这是一种更好的方法,因为它使用内置的能力来范围复制或甚至选择一个 DataTable 中的行到另一个 DataTable,而不需要显式地迭代每个元素,这与所有 foreach 循环、.ForEach 方法的答案都不同。 - David Burg

16

支持版本:4、3.5 SP1。您现在可以直接调用对象上的方法。

DataTable dataTable2 = dataTable1.Copy()

3
从技术角度讲,这将创建一个数据表的副本。虽然问题中没有明确说明,但可能dataTable2已经存在并且有其他行,我们不想失去它们。此外,问题明确指出“特定行”,而此方法处理所有行。 - Matt

7
由于其他帖子的影响,这是我能得到的最短的内容:
DataTable destTable = sourceTable.Clone();
sourceTable.AsEnumerable().Where(row => /* condition */ ).ToList().ForEach(row => destTable.ImportRow(row));

这基本上是一个foreach。另外,你没有按照OP的要求通过条件进行过滤。 - Eric Wu
现在,如果我清空sourceTable,那么destTable也会被清空吗? - Si8
我想要能够给一个变量赋值并清空原始变量,而不会清空目标变量。 - Si8

6
我已经创建了一个简单的方法来解决这个问题。
 DataTable newTable = oldtable.Clone();    
 for (int i = 0; i < oldtable.Rows.Count; i++)
 {
   DataRow drNew = newTable.NewRow();    
   drNew.ItemArray = oldtable.Rows[i].ItemArray;    
   newTable.Rows.Add(drNew);   
 } 

一个更简单的方法是,不使用 for,而是使用 foreach (Datarow dr...) - Freerey

3
我需要从多个具有相同结构的表中复制行,将它们放入一个新表中作为 datagridview 的数据源:
// Generate DataTable[] alltables from multiple datatables

DataTable newTable = alltables[0].Clone();
foreach (DataTable dt in alltables)
{
   for (int i = 0; i < dt.Rows.Count; i++)
      newTable.Rows.Add(dt.Rows[i].ItemArray);
}

2
以下示例是复制一行最快的方法。 每个单元格都是根据列名进行复制的。 如果您不需要复制特定单元格,则可以添加try catch或if语句。 如果您要复制多行,则循环下面的代码。
DataRow dr = dataset1.Tables[0].NewRow();
for (int i = 0; i < dataset1.Tables[1].Columns.Count; i++)
{
    dr[dataset1.Tables[1].Columns[i].ColumnName] = dataset1.Tables[1].Rows[0][i];
}

datasetReport.Tables[0].Rows.Add(dr);

将索引0更改为您指定的行索引或者如果您要循环或者逻辑上需要,可以使用变量:
dataset1.Tables[1].Rows[0][i];


1
 private void CopyDataTable(DataTable table){
     // Create an object variable for the copy.
     DataTable copyDataTable;
     copyDataTable = table.Copy();
     // Insert code to work with the copy.
 }

你的代码对我来说完美无缺,非常简单易懂,谢谢。 - Esraa_92

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接