7

dataColumnデータを からの特定の列に移動したいと考えていdataTableます。Datatableに追加したい列を指定する方法がわかりませんdatacolumn

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

私は例外を受け取りますColumn 'X' already belongs to another DataTable.

4

4 に答える 4

4

別のテーブルから DataColumn を追加することはできません。これは、元のテーブルとの関連付けが既にあり、DataColumn はオブジェクトであるため Add メソッドへの参照によって渡されるためです。コピーする必要があります。これを行う方法の 1 つを次に示します。

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 の回答の 2 番目のコードと同様の方法で。ただし、すべての列を新しいテーブルにコピーしていない場合は、エラー チェックを行うことをお勧めします。

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];
        }
    }
 } 
于 2012-07-19T15:44:32.390 に答える
0

テーブル データは、行ごとに整理され、次に列ごとに整理されます。(私が知っていることですが) データの列を 1 回で追加することはできません。列定義を 2 番目のテーブルに追加し、データを個別に追加する必要があります。

元のコードはすべての列をループしているため、不要なものを使用して元のデータテーブルをコピーしてDataTable.Copy()削除する方がよい場合があります。

于 2012-07-19T15:20:03.497 に答える