1

我正在尝试编写一个简单的例程来处理 ListView 中的项目列表,并能够处理所有项目或仅处理选定的项目。我希望这会起作用:

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

然后这样称呼它:

PurgeListOfStudies(myStudiesPageCurrent.ListView.Items);

或这个

PurgeListOfStudies(myStudiesPageCurrent.ListView.SelectedItems);

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

我尝试将参数的类型更改为objectICollection<ListViewItem>以及其他几件事。但是由于这些类型似乎完全不相关,所以无论是在编译时还是在强制转换期间的运行时,一切都会失败。

这一切对我来说似乎很奇怪,因为它们在现实中显然是相同的类型(ListViewItems 列表)。

我在这里错过了什么吗?

4

2 回答 2

5

使用 MSDN 文档。

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

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

private void PurgeListOfStudies(IEnumerable items)
{
    foreach(MyType currentItem in items) //implicit casting to desired type
    {
        // process current item in the list...
    }
}
于 2012-07-19T17:15:32.587 回答
0

If you wanted to make PurgeListOfStudies a little more type safe, you could make it take a parameter of type IEnumerable<ListViewItem> like so:

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

and call it like this:

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

or this:

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

The OfType<ListViewItem>() extension method turns a non-generic IEnumerable into the more type safe IEnumerable<ListViewItem>.

Edit: If you're annoyed by having to explicitly call OfType<ListViewItem>() you could add extension methods to 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>();
    }
}

and then call

PurgeListOfStudies(myStudiesPageCurrent.ListView.ListViewItems());

or

PurgeListOfStudies(myStudiesPageCurrent.ListView.SelectedListViewItems());
于 2016-10-23T16:34:10.080 回答