将两个数据表合并为一个 C#

Merging two Datatables into One C#

我有一个简单的问题但我无法解决它,问题是每次我合并两个数据tables 合并看起来很有趣,table 1 继续table 两个的顶部,我知道那是因为我没有设置列的主键,但是当我突然设置时,我得到了错误,因为实体列中有重复值。如何通过它,知道重复值将出现在主键列

private void button1_Click(object sender, EventArgs e)
            {
                DataTable merge = new DataTable() ;
                merge.Merge(t1());
                merge.Merge(t2());
                gridControl1.DataSource = merge.DefaultView;
            }
            public DataTable t1()
            {
                DataColumn col;

                DataTable d = new DataTable();
                d.Columns.Add("Enitity");

                d.PrimaryKey = new DataColumn[] { d.Columns["Enitity"] };
                //d.PrimaryKey = null;
                d.Columns.Add("Variable");
                d.Rows.Add(new string []{"K1","100"});
                d.Rows.Add(new string[] { "K1", "200" });
                d.Rows.Add(new string[] { "K3", "300" });
                d.Rows.Add(new string[] { "K4", "400" });
                d.Rows.Add(new string[] { "K6", "500" });
                d.Rows.Add(new string[] { "K5", "600" });
                return d;
            }
            public DataTable t2()
            {
                DataColumn col;
                DataTable d = new DataTable();
                d.Columns.Add("Enitity"); 
                d.PrimaryKey = new DataColumn[] { d.Columns["Enitity"] };
                d.PrimaryKey = null;
                d.Columns.Add("Variable2");
                d.Rows.Add(new string[] { "K1", "1000" });
                d.Rows.Add(new string[] { "K2", "2000" });
                d.Rows.Add(new string[] { "K3", "3000" });
                d.Rows.Add(new string[] { "K4", "4000" });
                d.Rows.Add(new string[] { "K5", "5000" });
                d.Rows.Add(new string[] { "K7", "6000" });
                return d;

            }

这就是我的合并的样子

Enitty      Variable       Variable 2
---------     -----        -----------
K1              .
K2              .
K3              .
K4              .
.
.
.
K1                             .
K2                             .
K3                             .
K4
.
.
.

嗯,问题是你不想合并table,你想合并,并且没有自动功能(据我所知)。

首先,您需要设置主键---没有它,就无法知道第一个table中的"K1"要与[=24=合并] 从第二个 table.

除此之外,据我所知,您必须手动进行实际合并。将 Table1 复制到新的 DataTable,添加额外的列。然后遍历 Table2,查找合并中的每个键 table,并添加新字段。

更新:这应该适合你:

DataTable merge = new DataTable() ;
merge.Merge(t1());
merge.Columns.Add("Variable2");
foreach(DataRow dr in t2().Rows)
{
    var old = merge.Select(string.Format("Enitity='{0}'", dr["Enitity"]) );
    if (old.Any())
        old[0]["Variable2"] = dr["Variable2"];
    else
          merge.Rows.Add(new string []{
                             dr["Enitity"] as string,
                             null, 
                             dr["Variable2"]as string});

}

如上所述,您不能设置主键,因为您有重复值。你可能最好使用 linq,比如:

        DataTable myNewDataTable = new DataTable();
        myNewDataTable.Columns.Add("Enitity", typeof(string));
        myNewDataTable.Columns.Add("Variable", typeof(string));
        myNewDataTable.Columns.Add("Variable2", typeof(string));
        var results = (from d1 in t1().AsEnumerable()
                       join d2 in t2().AsEnumerable()
                             on d1.Field<string>("Enitity") equals d2.Field<string>("Enitity")
                       select myNewDataTable.LoadDataRow( new object[] { d1.Field<string>("Enitity"), d1.Field<string>("Variable"), d2.Field<string>("Variable2") }, true) );
        myNewDataTable = results.CopyToDataTable<DataRow>();