从另一个线程访问ListBox.SelectedItems

时间:2012-03-27 10:26:02

标签: c# winforms multithreading

ListBox名为lstProductGroups。

在一个简单的Windows窗体上,一个名为GetGroups的方法为我提供了用户选择的字符串组,如Cars, Bikes等。

public List<string> GetGroups()
{
    List<string> prodGroups = (from object item in lstProductGroups.SelectedItems select item.ToString()).ToList();

    return prodGroups;
}

但是如果我尝试从另一个线程访问相同的方法,我会在列表中获取名为System.Data.DataRowView的所有项目。

我甚至在foreach循环中使用BeginInvoke进行了尝试,但item.ToString()始终返回System.Data.DataRowView

我是使用线程的Winforms新手。我做错了什么?

2 个答案:

答案 0 :(得分:1)

首先声明一个委托:

delegate List<string> GetItemsDlg();

像这样改变你的方法:

List<string> GetGroups() {
    if (lstProductGroups.InvokeRequired) {
        var dlg = new GetItemsDlg(GetGroups);
        return lstProductGroups.Invoke(dlg) as List<string>;
    }
    List<string> prodGroups = (from object item in lstProductGroups.SelectedItems select item.ToString()).ToList();

    return prodGroups;

}

调用您的方法:

List<string> items = GetGroups();

答案 1 :(得分:0)

如何调用:

Invoke((MethodInvoker) delegate
                               {
                                 ...
                               }