如何仅将旧数据表的必需行复制到结构不同的新数据表行?

时间:2018-11-28 14:58:27

标签: c# .net winforms datatable

我有一个需求,我需要将现有的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的数据。

为了获得预期的结果,上述代码需要进行哪些更改?

3 个答案:

答案 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中创建新行,并为所需的每个字段分配值。