如何在ListView处于虚拟模式时枚举它?

时间:2011-05-12 15:02:59

标签: c# listview virtualmode

如何在虚拟模式下枚举ListView?

我正在使用OfType<>()方法枚举列表视图项。但它抛出了一个例外,列表视图在虚拟模式下无法枚举。

这是我的代码

List<String> lst= myListView.Items.OfType<ListViewItem>().Select(X=>X.Text).ToList(); 

那么当它处于虚拟模式时,如何从ListView中获取该项?

请给我一个使用方法.OfType&lt;&gt;

提前致谢

2 个答案:

答案 0 :(得分:2)

当它处于虚拟模式时,您无法从列表视图中获取项目,因为这些项目不在列表视图中。这就是虚拟模式的重点。

而是按住项目,列表视图会询问显示项目所需的信息。如果您在虚拟模式下成功运行列表视图,那么您几乎肯定已经将列表中的项目放在某处。

引用documentation

  

将VirtualMode属性设置为   true将ListView置于虚拟状态   模式。在虚拟模式下,正常   物品收集未使用。代替,   ListViewItem对象已创建   动态,如ListView所需   它们。

     

虚拟模式在很多情况下都很有用   情况。如果是ListView对象   必须从一个非常大的人口填充   已经在内存中创建的集合   每个条目的ListViewItem对象   可能很浪费仅在虚拟模式下   创建所需的项目。在   其他情况下,价值观   可能需要ListViewItem对象   经常重新计算,并做   这对整个系列来说都会   产生不可接受的表现。在   虚拟模式,只需要所需的项目   计算。

答案 1 :(得分:0)

如果在列表处于虚拟模式时调用它,则ListViewItemCollection.GetEnumerator()方法会引发异常。这意味着您无法通过任何LINQ方法访问它们,包括OfType()

但是,您可以对列表进行简单的迭代:

List<string> lst = new List<string>();
for (int i = 0; i < listView1.VirtualListSize; i++) {
   lst.Add(listView1.Items[i].Text);

然而(再次),如果列表是虚拟的,它可能包含大量项目,因此可能需要一段时间:)