2012-07-19 21 views
5

Quiero mover los datos de un dataColumn a una columna específica en mi dataTable. No estoy seguro de cómo especificar qué columna dentro de mi Datatable Quiero añadir el datacolumn.DataColumn a DataTable

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

recibo una excepción Column 'X' already belongs to another DataTable.

+0

simplemente que desean añadir la _column_ (es decir, una columna con el mismo nombre y tipo) o mover los _data_ de una mesa a otra? –

+0

Mueva los datos de una tabla a otra. –

Respuesta

14

tiene que copiar las propiedades como ColumnName y crear nuevos DataColumns:

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

Hay una razón para la ArgumentException cuando se agrega un DataColumn que ya pertenece a otro DataTable. Sería muy peligroso permitir que desde una DataTable sostiene un reference a sus columnas y cada columna contiene una reference a ella es DataTable. Si agrega una columna a otra tabla, su código desaparecerá tarde o temprano.

Si también desea copiar el DataRows en la nueva tabla:

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

Entonces eso replica el nombre de la columna y el tipo de datos. ¿Cómo extraería los datos del col a la tabla de datos? –

+0

Entonces, ¿cuál es su pregunta real? ¿Desea copiar el esquema de una DataTable o desea copiar (también) todas las 'DataRows'? –

+0

Copie todos los datos en una tabla de datos separada. Quiero poder especificar a qué columnas copio los datos. –

0

este es un comportamiento normal, si va a añadir la misma columna a más de un DataTable ArgumentException será lanzada.

documentación ve aquí: http://msdn.microsoft.com/en-us/library/55b10992.aspx

puede crear una nueva columna misma que la que ya ha añadido a la tabla original y añadirlo a la tabla nueva.

0

datos de la tabla está organizada por fila, y luego por la columna. No puede (que yo sepa) agregar una columna de datos en una sola toma. Usted tendrá que añadir la definición de columna a la segunda tabla y agregar los datos en él por separado.

Debido a que su código original en bucle a través de todas las columnas, que puede ser mejor de la copia de la tabla de datos original utilizando DataTable.Copy() y eliminar lo que no hace quieren.

3

No se puede agregar un DataColumn de otra mesa, porque ya tiene una asociación con su tabla original y una DataColumn se pasa por referencia al método Add porque es un objeto. Tendrás que copiarlo. He aquí una manera que puede hacer lo siguiente:

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

Tenga en cuenta que también hay un método de extensión que se puede utilizar para copiar columnas individuales por su nombre, es decir, tableA.CopyColumnTo("Column1", tableB);.

A continuación, puede copiar los datos de este tipo si la nueva tabla es una copia exacta del original:

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

o de una manera similar a la segunda pieza de código en la respuesta de Tim Schmelter si no es una copia exacta. Quisiera, sin embargo, recomendaría echar un error si no está copiando todas las columnas en la nueva tabla:

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