我有以下代码:
DataTable datTable3 = new DataTable();
datTable3 = datTable1.Clone();
datTable2.Merge(datTable1);
datTable3 = datTable2.GetChanges();
我想要做的是:将DataTable1与DataTable2进行比较,当DataTable1中有不在DataTable 2中的行时,将这些行添加到新的DataTable(3)中。虽然第一个dt中的行不等于第二个dt中的行,但上面的代码每次都给我一个空的DataTable3。我究竟做错了什么?对不起,如果这个问题可能太容易了,但我几个月后就用C#了。
编辑:我发现这个解决方案对我不起作用......为什么? DataTable datTable3 = new DataTable();
datTable3 = datTable1.Clone();
foreach (DataRow row in datTable1.Rows)
{
datTable3.ImportRow(row);
}
foreach (DataRow row in datTable3.Rows)
{
row.SetAdded();
}
datTable2.Merge(datTable3);
DataTable datTableFinal = datTable2.GetChanges(DataRowState.Added);
// shows me a datatable with again the values from datTable1
// even if they are already in datTable2!
datTable2.RejectChanges();
datTable1.RejectChanges();
答案 0 :(得分:1)
DataTable.GetChanges()方法获取DataTable的副本,该副本包含自加载或上次调用AcceptChanges
以来对其所做的所有更改。
换句话说,GetChanges()
依赖于DataRow.RowState属性。 DataTable.Merge()将保留其“RowState”属性,或将其重置为“Unchanged”。
这意味着当您将两个DataTable与包含'Unchanged'RowStates的行合并时,合并的表也将包含'Unchanged'行,DataTable.GetChanges方法将返回null或Nothing。
编辑:您始终可以遍历DataTable
以查看合并表中添加了哪些行。像
foreach(DataRow row in datTable2.Rows)
{
Console.WriteLine("--- Row ---"); // Print separator.
foreach (var item in row.ItemArray) // Loop over the items.
{
Console.Write("Item: "); // Print label.
Console.WriteLine(item); // Invokes ToString abstract method.
}
}