无法将SelectedObjectCollection转换为ObjectCollection?

时间:2011-12-04 03:49:22

标签: c# winforms listbox

如果没有选择任何项目或其中一项,或者选择了多于1项,我试图获取ListBox中所有元素的列表。我编写了这样的代码,但它没有编译:

    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 个答案:

答案 0 :(得分:3)

您需要将SelectedObjectCollection转换为object[]的数组。

ListBox.SelectedObjectCollection sel = new 
                     ListBox.SelectedObjectCollection(listBoxXmlFilesReference);
ListBox.ObjectCollection col = new 
                     ListBox.ObjectCollection(listBoxXmlFilesReference,
                         sel.OfType<object>().ToArray());

答案 1 :(得分:3)

如果你不需要,我只需要一点点而不是乱用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 :(得分:2)

我可以看到你正在尝试做什么并且它没有编译,因为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