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];
}
}
}
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? –
Mueva los datos de una tabla a otra. –