如何在列表视图处于虚拟模式时枚举它

本文关键字:虚拟 模式 枚举 列表 视图 于虚拟 | 更新日期: 2023-09-27 17:56:09

如何在虚拟模式下枚举列表视图?

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

这是我的代码

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

那么,当项目处于虚拟模式时,如何从列表视图中获取该项目呢?

请给我发布一种使用方式。类型<>

提前致谢

如何在列表视图处于虚拟模式时枚举它

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

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

引用文档:

将虚拟模式属性设置为 true 将列表视图置于虚拟状态 模式。在虚拟模式下,正常 项目集合未使用。相反 创建列表视图项对象 根据列表视图的要求动态 他们。

虚拟模式在许多情况下都很有用 情况 下。如果列表视图对象 必须从非常大的地方填充 集合已在内存中,正在创建 每个条目的 ListViewItem 对象 可能会浪费。在虚拟模式下,仅 创建所需的项目。在 其他情况,值 列表视图项对象可能需要 经常重新计算,并执行 对于整个系列来说,这将 产生不可接受的性能。在 虚拟模式,仅必填项目 被计算出来。

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

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

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

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

for (int i=0;i< LSTView_Search.Items.Count;i++)
{
  LSTView_Search.Items[i];
}