5

我在虚拟模式下有一个 ListView。我想访问SelectedItems财产。
但是当我使用时ListView1.SelectedItems,我收到以下异常:

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

如何ListView1.SelectedItems在 VirtualMode 中访问。

4

4 回答 4

15

这是很老的帖子,但也许其他人会受益。

只需使用ListView.SelectedIndexCollection col = listView.SelectedIndices; Then 你就可以访问一个项目:

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

..但是您将无法使用 foreach 遍历 ListView.Items,因为在此模式下没有可用的迭代器。使用索引器很好:-)

尝试使用 foreach 时会出现异常:

当 ListView 处于虚拟模式时,您无法使用枚举器或调用 GetEnumerator 枚举 ListView 项目集合。请改用 ListView 项目索引器并按索引值访问项目。

于 2011-08-28T08:35:08.170 回答
2

文档

在虚拟模式下,Items 集合被禁用。尝试访问它会导致 InvalidOperationException。CheckedItems 集合和 SelectedItems 集合也是如此。如果要检索选定或选中的项目,请改用 SelectedIndices 和 CheckedIndices 集合。

于 2010-10-08T20:54:45.690 回答
0

我将所有项目存储在列表中并使用此列表在 RetrieveVirtualItem 中提供项目,您可以找到如下所示的选定项目

Dim lstData As List(Of ListViewItem) = New List(Of ListViewItem)
Dim lstSelectedItems As List(Of ListViewItem) = lstData.FindAll(Function(lstItem As ListViewItem) lstItem.Selected = True)
Me.Text = lstItems.Count.ToString()
于 2013-12-06T06:48:39.497 回答
-3

I've done it by the following code, but it has an exception when more than one item are selected:

指数超出范围。必须是非负数且小于集合的大小。参数名称:索引

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 回答