在DataTable中添加DataColumn

7

我想把dataColumn中的数据移动到我的dataTable中的特定列。我不确定如何指定我要将datacolumn添加到哪个Datatable列中。

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

我收到一个异常 列“X”已经属于另一个数据表。


你是想要添加一个同名同类型的_column_列,还是要把_data_数据从一张表移动到另一张表? - D Stanley
将数据从一个表移动到另一个表。 - escobar_season
4个回答

19
你需要复制类似ColumnName的属性并创建新的DataColumns:
foreach (DataColumn col in dt.Columns)
{
    dt1.Columns.Add(col.ColumnName, col.DataType);
}

当你添加一个已经属于另一张DataTableDataColumn时,会出现ArgumentException是有原因的。允许这样做非常危险,因为DataTable保存着它们列的引用,而每个列都保存着对应的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];
    }
}

如此可以复制列名和数据类型。我该如何从列中提取数据到数据表中? - escobar_season
那么你的实际问题是什么?你想复制一个 DataTable 的架构还是你想复制(也包括)所有的 DataRows? - Tim Schmelter
将所有数据复制到单独的数据表中。我想能够指定将数据复制到哪些列中。 - escobar_season
@escobar_season:我编辑了我的答案,展示了如何复制数据(只复制之前添加到表中的列)。 - Tim Schmelter

4

您无法从另一个表中添加DataColumn,因为它已经与原始表格有关联,并且DataColumn通过引用传递给Add方法,因为它是一个对象。您需要复制它。以下是一种您可以这样做的方法:

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);
}

如果不是完全复制的话,可以采用类似于Tim 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];
        }
    }
 } 

0

这是一种正常行为,如果您将相同的列添加到多个 DataTable 中,将抛出 ArgumentException。

请查看此处的文档: http://msdn.microsoft.com/en-us/library/55b10992.aspx

您可以创建一个与已添加到原始表中的列相同的新列,并将其添加到新表中。


0

表格数据按行、列的顺序组织。据我所知,你无法一次性添加一列数据。你需要将列定义添加到第二个表中,并单独添加数据。

由于您的原始代码循环遍历了所有列,因此最好使用DataTable.Copy()复制原始数据表并删除您不需要的内容。


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