我有一个需求,我需要将现有的DataTable
行/值复制到新的DataTable
,
新的DataTable具有自定义(不同的列名)结构/架构,因为我们需要将此新的DataTable数据稍后导出到Excel文件中。
要将必需的列值复制到新的DataTable
中,我创建了字符串Array,其中包含现有{的必需列名(我们需要从中将数据复制到新DataTable 的列) {1}},如下所示。
DataTable
为了获得所需的string[] selectedColumns = new[] { "SUPPLIER_NAME", "SUPPLIER_NO", "CONFIRMATION_NO", "RELEASE_NO", "WCO_INVOICE_NO",
"CUSTOMER_BILLED", "BALANCE_TOBILL", "SUPP_INVOICE_NO", "SUPPLIER_PAID", "BALANCE_COST" }; //TODO Add columns "WCO_INVOICE_DATE", "SUPPLIER_INVOICE_DATE" later.
,我创建了一种方法,该方法将通过以下方式调用:将现有的DataTable
和现有的DataTable
列名的选定列作为参数传递。>
DataTable
DataTable _dtPrjLedgerExportData = ControllerClass.dtProjectLedgerExport(dtfilter, selectedColumns);
类ControllerClass
方法将返回新创建的dtProjectLedgerExport
,即具有自定义列名称和从现有DatTable中提取的值的DataTable ,
新的DataTable
还包含两个新列(WCO_Invoice_Date,Supplier_Invoice_Date),其默认值为空白(从代码中设置)。
DataTable
问题: 上面的代码无法按预期方式工作,它返回具有相同结构的现有DataTable的数据。
为了获得预期的结果,上述代码需要进行哪些更改?
答案 0 :(得分:1)
我会使用这种方法:
public static DataTable DtProjectLedgerExport(DataTable dtToExport, string[] selectedColumns, params string[] additionalColumns)
{
DataTable dt = dtToExport.Copy(); // add columns and data
List<DataColumn> removeColumns = dt.Columns.Cast<DataColumn>()
.Where(c => !selectedColumns.Contains(c.ColumnName, StringComparer.InvariantCultureIgnoreCase))
.ToList();
removeColumns.ForEach(dt.Columns.Remove);
foreach (string colName in additionalColumns)
{
DataColumn newColumn = new DataColumn(colName);
newColumn.DefaultValue = string.Empty;
dt.Columns.Add(newColumn);
}
return dt;
}
答案 1 :(得分:1)
在注释中指出每个表中的列名不同...(严重的是,这是至关重要的信息,哈哈)!唯一的方法是自己像这样随意地映射每个列的值。
public static DataTable dtProjectLedgerExport(DataTable dtToExport)
{
DataTable dt = new DataTable();
dt.Columns.Add("Supplier");
dt.Columns.Add("Supplier_No");
dt.Columns.Add("Confirmation_Number");
dt.Columns.Add("Release_Number");
dt.Columns.Add("WCO_Invoice_No");
dt.Columns.Add("WCO_Invoice_Date");
dt.Columns.Add("Customer_Billed_Amt");
dt.Columns.Add("Balance_Remaining_to_Bill");
dt.Columns.Add("Supplier_Invoice_Number");
dt.Columns.Add("Supplier_Invoice_Date");
dt.Columns.Add("Supplier_Paid_Amt");
dt.Columns.Add("Remaining_Cost_Dollar_Balance");
foreach (var expRow in dtToExport.Rows)
{
var row = dt.NewRow();
row["Supplier"] = expRow["Supplier_Name"];
//repeat for all columns you want.
dt.Rows.Add(row);
}
return dt;
}
答案 2 :(得分:0)
当然,因为您最终完全覆盖了"browserslist": "> 0.25%, not dead"
。您应该在循环中枚举dt
中的行,并在dtToExport
中创建新行,并为所需的每个字段分配值。