当 ListView 处于虚拟模式时如何枚举它?
我正在使用OfType<>()
方法来枚举列表视图项。但是它会抛出一个异常,例如列表视图在虚拟模式下无法枚举。
这是我的代码
List<String> lst= myListView.Items.OfType<ListViewItem>().Select(X=>X.Text).ToList();
那么,当它处于虚拟模式时,我如何从 ListView 中获取项目?
请给我一个使用 .OfType<> 的方法
提前致谢
当 ListView 处于虚拟模式时如何枚举它?
我正在使用OfType<>()
方法来枚举列表视图项。但是它会抛出一个异常,例如列表视图在虚拟模式下无法枚举。
这是我的代码
List<String> lst= myListView.Items.OfType<ListViewItem>().Select(X=>X.Text).ToList();
那么,当它处于虚拟模式时,我如何从 ListView 中获取项目?
请给我一个使用 .OfType<> 的方法
提前致谢
当它处于虚拟模式时,您无法将项目从列表视图中取出,因为这些项目不在列表视图中。这就是虚拟模式的全部意义所在。
相反,您持有项目,列表视图会询问显示项目所需的信息。如果您在虚拟模式下成功操作列表视图,那么您几乎可以肯定已经在某处的列表中拥有项目。
引用文档:
将 VirtualMode 属性设置为 true 会使 ListView 进入虚拟模式。在虚拟模式下,未使用正常的 Items 集合。相反,ListViewItem 对象是动态创建的,因为 ListView 需要它们。
虚拟模式在许多情况下都很有用。如果必须从内存中已经非常大的集合中填充 ListView 对象,则为每个条目创建一个 ListViewItem 对象可能是一种浪费。在虚拟模式下,仅创建所需的项目。在其他情况下,可能需要经常重新计算 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);
但是(再次),如果列表是虚拟的,它可能有大量的项目,所以这可能需要一段时间 :)