如何将SelectedListViewItemCollection转换为ListViewItemCollection

时间:2012-07-19 16:57:46

标签: c# winforms listview

我正在尝试编写一个简单的例程来处理ListView中的项目列表,并且只能处理所有项目或所选项目。我希望这可行:

private void PurgeListOfStudies(ListView.ListViewItemCollection lvic)
{
    /// process items in the list...
}

然后像这样调用它:

PurgeListOfStudies(myStudiesPageCurrent.ListView.Items);

或者

PurgeListOfStudies(myStudiesPageCurrent.ListView.SelectedItems);

但是,这两个列表分别有不同且不相关的类型ListViewItemCollectionSelectedListViewItemCollection

我尝试将参数类型更改为objectICollection<ListViewItem>以及其他一些内容。但由于类型似乎完全不相关,所以在编译时或在演员表的运行时都会失败。

这一切对我来说都很奇怪,因为这些在现实中显然是同一类型(ListViewItem s的列表。)

我在这里错过了什么吗?

2 个答案:

答案 0 :(得分:5)

使用MSDN文档。

如您所见,这两个类都实现了接口:IListICollectionIEnumerable。您应该能够将其中任何一个用作通用接口。

注意这些是通用版本(即IEnumerable&lt; T&gt;))。您必须枚举集合并手动将它们转换为所需的对象类型。

private void PurgeListOfStudies(IEnumerable items)
{
    foreach(MyType currentItem in items) //implicit casting to desired type
    {
        // process current item in the list...
    }
}

答案 1 :(得分:0)

如果你想让PurgeListOfStudies更安全一些类型,你可以让它采用类型为IEnumerable<ListViewItem>的参数:

private void PurgeListOfStudies(IEnumerable<ListViewItem> items)
{
    /// process items in the list...
}

并将其称为:

PurgeListOfStudies(myStudiesPageCurrent.ListView.Items.OfType<ListViewItem>());

或者这个:

PurgeListOfStudies(myStudiesPageCurrent.ListView.SelectedItems.OfType<ListViewItem>());

OfType<ListViewItem>()扩展程序将非通用IEnumerable转换为更安全的IEnumerable<ListViewItem>

编辑: 如果您因为必须明确调用OfType<ListViewItem>()而烦恼,可以向ListView添加扩展方法:

static class ListViewExtensions
{
    public static IEnumerable<ListViewItem> SelectedListViewItems(this ListView listView)
    {
        return listView.SelectedItems.OfType<ListViewItem>();
    }

    public static IEnumerable<ListViewItem> ListViewItems(this ListView listView)
    {
        return listView.Items.OfType<ListViewItem>();
    }
}

然后致电

PurgeListOfStudies(myStudiesPageCurrent.ListView.ListViewItems());

PurgeListOfStudies(myStudiesPageCurrent.ListView.SelectedListViewItems());