c#为什么使用BeginInvoke委托只更新datagridview的最后一个条目

本文关键字:datagridview 更新 最后一个 为什么 BeginInvoke | 更新日期: 2023-09-27 18:05:12

我在更新WinForm上的datagridview时遇到了问题。我将datagridview的数据源设置为一个绑定列表,如下所示:

List<Data> rows = new List<Data>();
BindingList<Data> list = new BindingList<Data>(rows);
this.dataBindingSource.DataSource = list;
this.dataGridView3.DataSource = this.dataBindingSource;

在类中的不同方法中,我通过添加到绑定列表来添加到datagridview,如下所示:

Data theData = new Data();
....
//Data is an object with various getters and setters like
theData.price = ...
theData.qty = ...
....
this.BeginInvoke((MethodInvoker)delegate() { list.Add(Data); });

当我对正在更新绑定列表的方法进行单次调用时,这工作得很好。但是我有一种情况,我从不同的方法背靠背地调用该方法多次,像这样:

updateRowMethod(....);
updateRowMethod(....);

两个调用为更新提供了不同的数据。但是现在datagridview插入了2个新行,但是这两行都包含相同的数据,并且在这两行中它只显示在第二个方法调用中传递的数据。

将行添加到datagridview的方法首先用数据更新数据库,然后再将其添加到datagridview中,并且在启动时,datagridview中填充了来自数据库的数据。随后,如果我重新启动应用程序,datagridview将用正确的数据填充。因此,该问题仅在查看应用程序当前运行和更新时添加的新行时发生,在重新启动和从DB中提取数据时不会发生此问题。

我已经放入断点,并看到添加数据的BeginInvoke行被正确地调用两次,用于2个方法调用,并且两次正确的数据都进入该行,并且它添加了2个新行,但它只显示来自第二个函数调用的数据。

如果你们有什么见解,我将不胜感激。

谢谢

c#为什么使用BeginInvoke委托只更新datagridview的最后一个条目

闭包闭包…试试以下命令:

this.BeginInvoke((MethodInvoker)delegate() { 
     var thisData1 = Data; //this is important because it changes the context of the closure of the delegate.
     list.Add(thisData1); 
});