0

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

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

这是我的代码

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

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

请给我一个使用 .OfType<> 的方法

提前致谢

4

2 回答 2

2

当它处于虚拟模式时,您无法将项目从列表视图中取出,因为这些项目不在列表视图中。这就是虚拟模式的全部意义所在。

相反,您持有项目,列表视图会询问显示项目所需的信息。如果您在虚拟模式下成功操作列表视图,那么您几乎可以肯定已经在某处的列表中拥有项目。

引用文档

将 VirtualMode 属性设置为 true 会使 ListView 进入虚拟模式。在虚拟模式下,未使用正常的 Items 集合。相反,ListViewItem 对象是动态创建的,因为 ListView 需要它们。

虚拟模式在许多情况下都很有用。如果必须从内存中已经非常大的集合中填充 ListView 对象,则为每个条目创建一个 ListViewItem 对象可能是一种浪费。在虚拟模式下,仅创建所需的项目。在其他情况下,可能需要经常重新计算 ListViewItem 对象的值,并且对整个集合执行此操作会产生不可接受的性能。在虚拟模式下,只计算所需的项目。

于 2011-05-12T15:05:56.567 回答
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);

但是(再次),如果列表是虚拟的,它可能有大量的项目,所以这可能需要一段时间 :)

于 2011-05-13T12:46:39.410 回答