Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#为什么使用BeginInvoke委托只使用多个条目中的最后一个更新datagridview_C#_.net_Winforms_Datagridview - Fatal编程技术网

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

C#为什么使用BeginInvoke委托只使用多个条目中的最后一个更新datagridview,c#,.net,winforms,datagridview,C#,.net,Winforms,Datagridview,在WinForm上更新的datagridview时出现问题。我将datagridview的数据源设置为bindinglist,如下所示: List<Data> rows = new List<Data>(); BindingList<Data> list = new BindingList<Data>(rows); this.dataBindingSource.DataSource = list; this.dataGridView3.Data

在WinForm上更新的datagridview时出现问题。我将datagridview的数据源设置为bindinglist,如下所示:

List<Data> rows = new List<Data>();

BindingList<Data> list = new BindingList<Data>(rows);

this.dataBindingSource.DataSource = list;
this.dataGridView3.DataSource = this.dataBindingSource;
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将填充正确的数据。因此,只有在查看应用程序当前正在运行和更新时添加的新行时才会出现问题,而在重新启动时不会出现问题,并且从数据库中提取数据

我已经设置了断点,看到添加数据的BeginInvoke行在2次方法调用中被正确调用了两次,两次正确的数据都进入该行,它添加了2个新行,但它只显示了第二次函数调用的数据

我将非常感谢你们所有人的任何见解


谢谢

闭包。。。请尝试以下操作:

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

那是在foreach循环内吗?不,不是在foreachFine内,我不想猜。请张贴相关代码(原件)。如何调用
BeginInvoke
两次等,以便轻松回答。问题可能是关闭同一个变量会改变其值。谢谢。不,我没让你猜。具有begininvoke的方法是通过单击按钮来调用的,所以实际上,我的示例中的这两个方法调用都是单击按钮的方法,我已经发布了它的主要内容,所有其他操作都只是在使用BeginInvoke的方法中为数据对象调用更多的setter。如果将数据添加到
行而不是
列表
,是否有效?是的,它仍然添加了两行,但只包含第二个方法调用的数据。@Mzn
var thisData1=Data
应该在
BeginInvoke
之外,然后它就可以工作了。您的代码再次将闭包捕获为局部变量,在闭包发生之前它应该是局部的。或者干脆不使用
BeginInvoke
,只需调用
Invoke
一切都应该很好,然后抱歉,我仍然不确定这是否有效<代码>数据
很可能是一个类(参考类型),当添加到
列表
两次时,其值也不会被复制。它只有相同的值(除非OP创建了新数据)