C#从BGW访问ListViewItem

时间:2012-07-04 18:41:16

标签: c# listview backgroundworker

我正在编写一个处理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)
        {
            ...
        }
        ...
    }

1 个答案:

答案 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元素与数据同步的选项。