2012-07-19 81 views
5

我想将dataColumn中的数据移动到我的dataTable中的特定列。我不知道如何指定我想要添加datacolumnDatatable内的列。将DataColumn添加到DataTable

 foreach (DataColumn col in dt.Columns) 
     { 
      dt1.Columns.Add(col); 
     } 

我收到一个异常Column 'X' already belongs to another DataTable.

+0

您只是想添加_column_(意为具有相同名称和类型的列)或移动_data_从一个表到另一个表? – 2012-07-19 15:13:48

+0

将数据从一个表移动到另一个表。 – 2012-07-19 15:14:28

回答

14

你需要的属性复制像ColumnName,创造新的DataColumns

foreach (DataColumn col in dt.Columns) 
{ 
    dt1.Columns.Add(col.ColumnName, col.DataType); 
} 

还有为ArgumentException一个原因,当你添加这已属于另一个数据表中的DataColumn。由于DataTable的列中保存reference,并且每列都包含一个reference,因此它是DataTable,这是非常危险的。如果你想添加一列到另一个表,你的代码早晚会吹。

如果你也想在DataRows复制到新表:

foreach (DataRow row in t1.Rows) 
{ 
    var r = t2.Rows.Add(); 
    foreach (DataColumn col in t2.Columns) 
    { 
     r[col.ColumnName] = row[col.ColumnName]; 
    } 
} 
+0

这样就可以复制列名和数据类型。我如何将数据从col中提取到数据表? – 2012-07-19 15:20:16

+0

那么你真正的问题是什么?你想复制一个DataTable的模式还是你想复制(也)所有'DataRows'? – 2012-07-19 15:21:19

+0

将所有数据复制到一个单独的数据表中。我想能够指定我将数据复制到哪些列。 – 2012-07-19 15:23:27

0

这是一种正常的行为,如果你添加相同的列到多个数据表的ArgumentException将被抛出。

看到文档的位置: http://msdn.microsoft.com/en-us/library/55b10992.aspx

你可以创建一个新列一样的,你已经添加到原始表并将其添加到新表。

0

表的数据由行组织,然后通过柱。你不能(我知道)一次添加一列数据。您需要将第号定义列添加到第二个表中,并分别向其中添加数据。

因为你原来的代码通过所有列循环,你可能会更好使用DataTable.Copy()复制原始数据表和删除您做什么不希望。

3

您不能从另一个表中添加DataColumn,因为它已经与它的原始表关联并且DataColumn通过引用传递给Add方法,因为它是一个Object。你必须复制它。这里是你可以做的一个方法:

public static class DataColumnExtensions 
{ 
    public static DataColumn CopyTo(this DataColumn column, DataTable table) 
    { 
     DataColumn newColumn = new DataColumn(column.ColumnName, column.DataType, column.Expression, column.ColumnMapping); 
     newColumn.AllowDBNull = column.AllowDBNull; 
     newColumn.AutoIncrement = column.AutoIncrement; 
     newColumn.AutoIncrementSeed = column.AutoIncrementSeed; 
     newColumn.AutoIncrementStep = column.AutoIncrementStep; 
     newColumn.Caption = column.Caption; 
     newColumn.DateTimeMode = column.DateTimeMode; 
     newColumn.DefaultValue = column.DefaultValue; 
     newColumn.MaxLength = column.MaxLength; 
     newColumn.ReadOnly = column.ReadOnly; 
     newColumn.Unique = column.Unique; 

     table.Columns.Add(newColumn); 

     return newColumn; 
    } 

    public static DataColumn CopyColumnTo(this DataTable sourceTable, string columnName, DataTable destinationTable) 
    { 
     if (sourceTable.Columns.Contains(columnName)) 
     { 
      return sourceTable.Columns[columnName].CopyTo(destinationTable); 
     } 
     else 
     { 
      throw new ArgumentException("The specified column does not exist", "columnName"); 
     } 
    } 
} 

public class MyClass 
{ 
    public static void Main() 
    { 
     DataTable tableA = new DataTable("TableA"); 
     tableA.Columns.Add("Column1", typeof(int)); 
     tableA.Columns.Add("Column2", typeof(string)); 

     DataTable tableB = new DataTable("TableB"); 

     foreach (DataColumn column in tableA.Columns) 
     { 
      column.CopyTo(tableB); 
     } 
    } 
} 

注意,也有一个扩展方法,可以用来通过名字来单独列复制,即tableA.CopyColumnTo("Column1", tableB);

然后你就可以复制这样的数据如果新表是原件的精确副本:

foreach (DataRow row in tableA.Rows) 
{ 
    tableB.Rows.Add(row.ItemArray); 
} 

,或者以类似于第二件添Schmelter的答案代码的方式,如果它不是一个确切的副本。但是,如果您不是将所有列复制到新表格中,我会推荐一些错误检查:

foreach (DataRow souceRow in sourceTable.Rows) 
{ 
    DataRow destinationRow = destinationTable.Rows.Add(); 

    foreach (DataColumn destinationColumn in destinationTable.Columns) 
    { 
     string columnName = destinationColumn.ColumnName; 

     if (sourceTable.Columns.Contains(columnName)) 
     { 
      destinationRow[columnName] = sourceRow[columnName]; 
     } 
    } 
} 
相关问题