1

ListView内のアイテムのリストを処理し、すべてのアイテムまたは選択したアイテムのみを処理できるようにする簡単なルーチンを作成しようとしています。私はこれがうまくいくと思っていました:

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

そしてそれをこのように呼びます:

PurgeListOfStudies(myStudiesPageCurrent.ListView.Items);

またはこれ

PurgeListOfStudies(myStudiesPageCurrent.ListView.SelectedItems);

ただし、2つのリストには、それぞれ異なるタイプと無関係なタイプがListViewItemCollectionあり SelectedListViewItemCollectionます。

パラメータのタイプをに変更してみましたが、object他にICollection<ListViewItem>もいくつかあります。ただし、型は完全に無関係であるように見えるため、コンパイル時またはキャスト中の実行時にすべてが失敗します。

これらは実際には明らかに同じタイプであるため、これはすべて私には奇妙に思えます(ListViewItemsのリスト)。

ここで何かが足りませんか?

4

2 に答える 2

5

MSDNのドキュメントを使用してください。

ご覧のとおり、両方のクラスがIListICollection、およびIEnumerableのインターフェイスを実装しています。これらのいずれかを共通のインターフェースとして使用できるはずです。

これらは汎用バージョンではないことに注意してください(つまり、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

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());
于 2016-10-23T16:34:10.080 に答える