首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >向DataTable添加DataColumn

向DataTable添加DataColumn
EN

Stack Overflow用户
提问于 2012-07-19 23:05:34
回答 4查看 26K关注 0票数 7

我想将数据从dataColumn移到dataTable中的特定列。我不确定如何指定要添加datacolumnDatatable中的哪一列。

代码语言:javascript
复制
        foreach (DataColumn col in dt.Columns)
        {
            dt1.Columns.Add(col);
        }

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

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-07-19 23:12:12

您需要复制ColumnName等属性并创建新的DataColumns

代码语言:javascript
复制
foreach (DataColumn col in dt.Columns)
{
    dt1.Columns.Add(col.ColumnName, col.DataType);
}

当你添加一个已经属于另一个ArgumentExceptionDataColumn时,出现DataTable是有原因的。允许这样做将是非常危险的,因为DataTable持有对其列的reference,而每一列都持有对其DataTable的reference。如果您想向另一个表中添加一列,您的代码迟早会崩溃。

如果您还想将DataRows复制到新表中:

代码语言:javascript
复制
foreach (DataRow row in t1.Rows)
{
    var r = t2.Rows.Add();
    foreach (DataColumn col in t2.Columns)
    {
        r[col.ColumnName] = row[col.ColumnName];
    }
}
票数 19
EN

Stack Overflow用户

发布于 2012-07-19 23:44:32

不能从另一个表添加DataColumn,因为它已经与它的原始表有关联,并且DataColumn是通过引用传递给add方法的,因为它是一个对象。你得把它复制下来。这是你可以做到的一种方法:

代码语言:javascript
复制
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);

然后,如果新表是原表的精确副本,则可以像这样复制数据:

代码语言:javascript
复制
foreach (DataRow row in tableA.Rows)
{
    tableB.Rows.Add(row.ItemArray);
}

或者以类似于Tim Schmelter答案中的第二段代码的方式,如果它不是完全相同的副本。但是,如果您没有将所有列复制到新表中,我建议您进行一些错误检查:

代码语言:javascript
复制
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];
        }
    }
 } 
票数 4
EN

Stack Overflow用户

发布于 2012-07-19 23:12:02

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

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

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11563731

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档