2012-03-27 3 views
1

У меня есть ListBox lstProductGroups.Доступ СписокBox.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

+0

Вы пытались вызвать метод GetGroups() из другого потока с помощью Invoke()? Он должен вернуть правильный список. –

+0

Событие стороннего API, на которое я подписался. Я не знаю их внутренней реализации. Но любой код обновления пользовательского интерфейса из метода события поднял «Неверная обработка кросс-потоков»: «Контроль» был получен из потока, отличного от потока, на котором он был создан. « –

ответ

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:

Invoke((MethodInvoker) delegate 
           { 
           ... 
           } 
Смежные вопросы