Чтение коллекции ListView SelectedItems из другого потока - PullRequest
0 голосов
/ 30 января 2020

Я пытаюсь выполнить некоторые действия с выбранными элементами в ListView в приложении Windows Forms из фонового потока. У меня есть метод делегата в моем коде, например, так:

private delegate ListView.SelectedListViewItemCollection dlgGetSelectedJobs();

private ListView.SelectedListViewItemCollection GetSelectedJobs()
{
    if(listViewJobViewer.InvokeRequired)
    {
        var dlg = new dlgGetSelectedJobs(GetSelectedJobs);
        return listViewJobViewer.Invoke(dlg) as ListView.SelectedListViewItemCollection;
    }
    return listViewJobViewer.SelectedItems;
}

Это вызывается в другом месте в фоновом потоке, используя следующее:

                    foreach(ListViewItem job in GetSelectedJobs())
                    { 
                        // Do stuff
                    }

Однако всякий раз, когда код входит в foreach l oop Я получаю перекрестное исключение, и я не уверен, почему ... Любая помощь с благодарностью получена!

1 Ответ

0 голосов
/ 30 января 2020

Спасибо MongZhu за помощь!

Мне удалось обойти эту проблему, изменив мой метод делегата на использование Linq для возврата списка на основе выбранных элементов в ListView:

private delegate List<ListViewItem> dlgGetSelectedJobs();

private List<ListViewItem> GetSelectedJobs()
{
    if(listViewJobViewer.InvokeRequired)
    {
        var dlg = new dlgGetSelectedJobs(GetSelectedJobs);
        return listViewJobViewer.Invoke(dlg) as List<ListViewItem>;
    }
    return (from ListViewItem i in listViewJobViewer.SelectedItems select i).ToList();
}

Я все еще не уверен, почему это не сработало, когда я пытался вернуть коллекцию, но, похоже, это работает правильно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...