2012-07-19 20 views
5

dataColumnのデータをdataTableの特定の列に移動したいとします。 Datatabledatacolumnを追加したいのですが、どの列を指定するかわかりません。あなたが複数のDataTable ArgumentExceptionがに同じ列がスローされます追加している場合DataTableにDataColumnを追加する

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

私は例外Column 'X' already belongs to another DataTable.

+0

_column_(同じ名前と種類の列を意味する)を追加するか、あるテーブルから別のテーブルへの_data_? –

+0

あるテーブルから別のテーブルにデータを移動します。 –

答えて

14

あなたはColumnNameなどのプロパティをコピーして、DataColumns新しいを作成する必要があります。

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

すでに別のDataTableに属しDataColumnを追加ArgumentException理由があります。 DataTableがその列にreferenceを保持し、すべての列がDataTableにreferenceを保持するので、それを許可することは非常に危険です。別のテーブルに列を追加すると、コードは遅かれ早かれ爆発するでしょう。

あなたも新しいテーブルに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からデータテーブルにデータを抽出しますか? –

+0

あなたの実際の質問は何ですか? DataTableのスキーマをコピーするか、すべての 'DataRows'をコピーしますか? –

+0

すべてのデータを別々のデータテーブルにコピーします。私はデータをコピーする列を指定できるようにしたい。 –

0

を受け、これは、正常な動作です。 http://msdn.microsoft.com/en-us/library/55b10992.aspx

あなたはすでに元のテーブルに追加されたものと同じ新しい列を作成し、新しいテーブルに追加することができます

はこちらのマニュアルを参照してください。

0

表データをカラムにより、行によって構成されています。あなたは(私が知っている)1つのショットでデータの列を追加することはできません。 2列目の表に列を追加し、それに別々にデータを追加する必要があります。

あなたの元のコードは、すべての列を通ってループするので、あなたはDataTable.Copy()を使用して、元のデータテーブルをコピーし、あなたが望んでいん何を削除したほうが良いかもしれません。

3

他のテーブルからDataColumnを追加することはできません。既存のテーブルとの関連付けが既にあり、DataColumnはObjectであるためAddメソッドへの参照によって渡されます。それをコピーする必要があります。名前で個々の列をコピーするために使用することができ、拡張方法、すなわちtableA.CopyColumnTo("Column1", tableB);もあることを

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

注:ここではあなたがそれを行うことができます一つの方法です。

新しいテーブルは、元の正確なコピーであるなら、あなたはこのようなデータをコピーすることができます

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]; 
     } 
    } 
} 
関連する問題