5

仮想モードで ListView を使用しています。SelectedItemsプロパティにアクセスしたい。
しかし、 を使用するListView1.SelectedItemsと、次の Exception が発生します。

Cannot access the selected items collection when the ListView is in virtual mode

ListView1.SelectedItemsVirtualMode でアクセスするにはどうすればよいですか。

4

4 に答える 4

15

かなり古い投稿ですが、他の誰かが恩恵を受けるかもしれません。

使用するだけListView.SelectedIndexCollection col = listView.SelectedIndices; で、アイテムにアクセスできます。

forearch(var item in col)
{
   string txt = listView.Items[item].Text;
}

..しかし、このモードではイテレータを使用できないため、foreach を使用して ListView.Items を反復処理することはできません。インデクサーの使用は問題なく飛んでいます:-)

foreach を使用しようとすると、例外が発生します。

ListView が仮想モードの場合、列挙子を使用して ListView 項目コレクションを列挙したり、GetEnumerator を呼び出したりすることはできません。代わりに ListView アイテム インデクサーを使用し、インデックス値でアイテムにアクセスします。

于 2011-08-28T08:35:08.170 に答える
2

ドキュメントから

仮想モードでは、Items コレクションは無効になっています。アクセスしようとすると、InvalidOperationException が発生します。CheckedItems コレクションと SelectedItems コレクションについても同様です。選択またはチェックされた項目を取得する場合は、代わりに SelectedIndices および CheckedIndices コレクションを使用します。

于 2010-10-08T20:54:45.690 に答える
-3

次のコードで実行しましたが、複数のアイテムが選択されている場合は例外です。

インデックスが範囲外でした。負ではなく、コレクションのサイズより小さくなければなりません。パラメータ名:インデックス

List<ListViewItem> ListViewItems = new List<ListViewItem>();

foreach (int index in listView1.SelectedIndices)
{
    ListViewItem SelectedListViewItem = listView1.Items[index];  // exception
    ListViewItems.RemoveAt(index);
}
…

void listView1_RetrieveVirtualItem(object sender, RetrieveVirtualItemEventArgs e)
{
    e.Item = ListViewItems[e.ItemIndex];
}

コレクションからアイテムを削除するときはいつでも、次のように最大のインデックスから最小のインデックスまで常に繰り返します。

for (int index = listView1.SelectedIndices.Count - 1; i >= 0; i--)
{
    …
}

これは、コレクション内の項目を削除するたびに、最大のインデックスから最小のインデックスに反復処理を行わないと、インデックスが変更されるためです。

于 2010-10-09T07:59:26.733 に答える