2012-03-27 59 views
1

我有ListBox叫做lstProductGroups。從另一個線程訪問ListBox.SelectedItems

在一個簡單的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的新手。我究竟做錯了什麼?

+0

你在使用什麼來促進穿線; 'BackgroundWorker','Thread','Task'? – MoonKnight 2012-03-27 10:29:24

+0

您是否嘗試使用Invoke()從另一個線程中調用GetGroups()方法?它應該返回正確的列表。 – 2012-03-27 10:33:33

+0

我訂閱的第三方API事件。我不知道他們的內部實施。但事件方法中的任何UI更新代碼引發了'跨線程操作無效:從其創建的線程以外的線程訪問控制.' – 2012-03-27 10:34:27

回答

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(); 
0

如何調用:

Invoke((MethodInvoker) delegate 
           { 
           ... 
           }