Не удается преобразовать SelectedObjectCollection в ObjectCollection? - PullRequest
3 голосов
/ 04 декабря 2011

Я пытаюсь получить список всех элементов из ListBox, если ни один или один из элементов не выбран, или список выбранных элементов, если выбрано более 1. Я написал такой код, но он не компилируется:

    ListBox.ObjectCollection listBoXElemetsCollection;

    //loading of all/selected XMLs to the XPathDocList
    if (listBoxXmlFilesReference.SelectedIndices.Count < 2)
    {
        listBoXElemetsCollection = new ListBox.ObjectCollection(listBoxXmlFilesReference);
    }
    else
    {
        listBoXElemetsCollection = new ListBox.SelectedObjectCollection(listBoxXmlFilesReference);
    }

Итак, чтобы этот кусок кода работал, мне нужно было бы использовать что-то вроде ListBox.SelectedObjectCollection listBoxSelectedElementsCollection;, которое мне не нужно, потому что я хотел бы использовать его в таком foreach:

            foreach (string fileName in listBoXElemetsCollection)
            {
            //...
            }

Ответы [ 3 ]

3 голосов
/ 04 декабря 2011

Вам необходимо преобразовать SelectedObjectCollection в массив object[].

ListBox.SelectedObjectCollection sel = new 
                     ListBox.SelectedObjectCollection(listBoxXmlFilesReference);
ListBox.ObjectCollection col = new 
                     ListBox.ObjectCollection(listBoxXmlFilesReference,
                         sel.OfType<object>().ToArray());
3 голосов
/ 04 декабря 2011

Я бы просто немного поработал и не связывался с ListBox ObjectCollections, если вам это не нужно.Поскольку вы хотите перебирать элементы в вашем ListBox в виде строк, почему бы не использовать List и загружать список так, как вы его видите:

List<string> listItems;

if (listBoxXmlFilesReference.SelectedIndices.Count < 2) {
    listItems = listBoxXmlFilesReference.Items.Cast<string>().ToList();
} else {
    listItems = listBoxXmlFilesReference.SelectedItems.Cast<string>().ToList();
}

foreach (string filename in listItems) {
    // ..
}
2 голосов
/ 04 декабря 2011

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

Предполагая, что ваши элементы являются строками в списке, вы можете сделать:

var items = listBoXElemetsCollection.Items.OfType<string>();
if (listBoXElemetsCollection .SelectedIndices.Count >= 2)
      items = listBoXElemetsCollection.SelectedItems.OfType<string>();      

foreach(var item in items)
            //do stuff
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...