当ListView处于虚拟模式时,无法访问所选项集合?

时间:2010-10-08 20:50:21

标签: c# listview selecteditem virtualmode

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

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

如何在VirtualMode中访问ListView1.SelectedItems

4 个答案:

答案 0 :(得分:13)

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

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

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

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

尝试使用foreach时会遇到异常:

  

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

答案 1 :(得分:2)

来自docs

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

答案 2 :(得分: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()

答案 3 :(得分:-3)

我已经通过以下代码完成了它,但是当选择了多个项目时它有一个例外:

  

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

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--)
{
    …
}

这是因为每次删除集合中的项目时,如果不从最大索引到最小索引进行迭代,索引将会改变。