我想把dataColumn
中的数据移动到我的dataTable
中的特定列。我不确定如何指定我要将datacolumn
添加到哪个Datatable
列中。
foreach (DataColumn col in dt.Columns)
{
dt1.Columns.Add(col);
}
我收到一个异常 列“X”已经属于另一个数据表。
我想把dataColumn
中的数据移动到我的dataTable
中的特定列。我不确定如何指定我要将datacolumn
添加到哪个Datatable
列中。
foreach (DataColumn col in dt.Columns)
{
dt1.Columns.Add(col);
}
我收到一个异常 列“X”已经属于另一个数据表。
ColumnName
的属性并创建新的DataColumns
:foreach (DataColumn col in dt.Columns)
{
dt1.Columns.Add(col.ColumnName, col.DataType);
}
当你添加一个已经属于另一张DataTable
的DataColumn
时,会出现ArgumentException
是有原因的。允许这样做非常危险,因为DataTable
保存着它们列的引用,而每个列都保存着对应的DataTable
的引用。如果你将一列添加到另一个表中,你的代码迟早会崩溃。
如果你还想将DataRows
复制到新表中:
foreach (DataRow row in t1.Rows)
{
var r = t2.Rows.Add();
foreach (DataColumn col in t2.Columns)
{
r[col.ColumnName] = row[col.ColumnName];
}
}
您无法从另一个表中添加DataColumn,因为它已经与原始表格有关联,并且DataColumn通过引用传递给Add方法,因为它是一个对象。您需要复制它。以下是一种您可以这样做的方法:
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答案中第二段代码的方式。但是我建议在将所有列复制到新表时进行一些错误检查:
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];
}
}
}
这是一种正常行为,如果您将相同的列添加到多个 DataTable 中,将抛出 ArgumentException。
请查看此处的文档: http://msdn.microsoft.com/en-us/library/55b10992.aspx
您可以创建一个与已添加到原始表中的列相同的新列,并将其添加到新表中。
表格数据按行、列的顺序组织。据我所知,你无法一次性添加一列数据。你需要将列定义添加到第二个表中,并单独添加数据。
由于您的原始代码循环遍历了所有列,因此最好使用DataTable.Copy()
复制原始数据表并删除您不需要的内容。