我正在编写一个处理DB的程序,并将任何更改写入ListView以供用户处理它们。之后,将所有更改写回DB,但我无法弄清楚如何从BGW到达ListView.ListViewItemCollection。我试过使用Control.Invoke,但我很害怕我还不够熟练,无法使它工作。
我得到的错误说我无法从线程中访问该控件,而不是在
上创建的 private delegate void BGOUdate(ListView.ListViewItemCollection lvic);
BGOU = new BGOUdate(ApplyChanges);
bgw1.RunWorkerAsync(lvProducts.Items);
private void bgwSearcher_DoWork(object sender, DoWorkEventArgs e)
{
BGOU(e.Argument as ListView.ListViewItemCollection);
}
private void ApplyChanges(ListView.ListViewItemCollection lvic)
{
...
foreach (ListViewItem item in lvic)
{
...
}
...
}
答案 0 :(得分:0)
Control.Invoke
是走路的正确方法。但是您需要将控件传递给后台工作程序,而不仅仅是ItemCollection
:
private void ApplyChanges(ListView lv)
{
lv.Invoke((Action)delegate
{
foreach (ListViewItem item in lv.Items)
{
...
}
});
...
}
这样,ListViewItems的所有更改都将在创建控件的线程中进行。
Action
是一个不带参数的预定义void委托。关键字delegate
将以下块标记为匿名函数,并向其返回一个委托,然后将其转换为可在控件上调用的Action
。对Invoke
的调用导致传递的委托在与控件的窗口句柄相关联的线程上执行,这几乎每次都是创建者线程。
也许,您应该将DataBinding视为保持GUI元素与数据同步的选项。