我有一个带有gridview的c#winforms应用程序。 gridview数据源由数据集填充。 此数据集的内容每隔几秒就会更新一次,并且数据集中的项目数量并不总是相同。 数据集实际上被多个其他数据集一次一个地传入(或需要填充)。这些数据集在完全随机的时间更新,无法控制。
由于GridView数据集本质上是“持续更新” - 在更新时(需要将现有GridView数据源中包含最新信息的新数据集合并到一起)我需要填充gridview的当前数据集的副本,将其与来自其他数据集的传入数据进行比较,并仅更新新数据。
我尝试过一系列不同的方法,但似乎无法让它发挥作用。我最终得到的数据集只是被添加到不断重复的略有不同的数据,或者行随机被删除(我尝试使用合并所有然后删除方法只能偶尔使用)。
目前,gridview只是自我更新,以显示最新的传入数据集,而不会将之前的数据集合并到其中......
//If the existing GridView dataset contains any rows that
//exist in the incoming latest dataset (matched on the two unique fields
//of the dataset), then remove that row from the existing GridView dataset
for (int i = 0; i < existingPriceResultsDTCopyForCompare.Rows.Count; i++)
{
foreach (DataRow incomingRow in incomingDS.Tables[0].Rows)
{
string incomingDate = incomingRow["Date"].ToString();
DataRow currentRow = existingPriceResultsDTCopyForCompare.Rows[i];
if ((currentRow["CCY"].ToString().Contains(incomingCcy))
&& (currentRow["Date"].ToString().Contains(incomingDate)))
{
existingPriceResultsDT.Rows.RemoveAt(i);
}
}
}
//Then merge the existing GridView dataset (Minus the old data that
//matches the data from the incoming Dataset with the latest information),
//With the brand new incoming data.
incomingDS.Merge(existingPriceResultsDT);
我开始怀疑在迭代有时间完成之前,传入的数据集是否会被下一个传入数据集覆盖。所以我猜我需要锁定传入的DataSet?
答案 0 :(得分:1)
你有没有试过类似的东西
DataSet ds1 = new DataSet();
DataSet ds2 = new DataSet();
ds1.Merge(ds2);
DataSet ds3 = ds1.GetChanges();
根据您的对象
DataSet existingPriceResultsDT = new DataSet();
DataSet incomingDS = new DataSet();
incomingDS.Merge(existingPriceResultsDT);
existingPriceResultsDT = incomingDS.GetChanges();
答案 1 :(得分:0)
您可能需要查看Microsoft Sync Framework。这听起来像是一个完美的场景。这个video是一个很好的介绍。您也可以下载教程here。
答案 2 :(得分:0)
嵌套的for-loop东西是一个很大的噩梦。你肯定想要摆脱循环这些行 - 很多不必要的比较。
看起来你每次都要比较几个列 - “CCY”和“Date”。您是否考虑过将它们作为桌子的主键?如果这对您的场景有意义,那么您可以提高效率。
你可以考虑做这样的事情:
确定哪些列是主键 - 此处显示CCY和Date适合您。
DataColumn[] keys = new DataColumn[2];
keys[0] = dataTable.column["CCY"];
keys[1] = dataTable.column["Date"];
dataTable.PrimaryKey = keys;
然后当你读入一个新的DataSet时 - 无论如何你都这样做,就像这样调用Merge:
dataSet.Merge(newDataSet, false, MissingSchemaAction.Add);
这里的假设是dataTable是dataSet的Tables [0]。
至少对于我的快速测试程序,这将合并两个DataSet并更新已更改的行并添加任何新的。
而且,我只是设置了我的DataGridView:
dataGridView1.DataSource = dataSet.Tables[0];
似乎为我的测试程序更好地更新了视图。
希望有所帮助。