在虚拟模式下循环ListView中的所有元素

时间:2009-01-14 21:17:46

标签: c# .net winforms listview

我有一个报告模块,可以从ListViews创建PDF报告。

现在,我在虚拟模式下有一个ListView,因此我无法遍历Items集合。

如何从报告模块中循环列表视图中的所有元素?

我可以获得VirtualListSize属性,因此我知道列表中有多少元素。 我可以以某种方式明确地调用RetreiveVirtualItem吗?

报告模块不了解ListView中的底层列表。

4 个答案:

答案 0 :(得分:4)

因此,虚拟模式下的列表视图只是基础列表的可视化,对吗?

也许报告应该从基础列表而不是虚拟列表视图中获取数据。

答案 1 :(得分:2)

在虚拟ListView中,您无法迭代Items,但您仍然可以通过索引访问它们:

for (int i = 0; i <  theVirtualListView.VirtualListSize; i++) {
    this.DoSomething(theVirtualListView.Items[i]);
}

答案 2 :(得分:1)

我提出的最佳解决方案是在报告类中有一个委托,其中传递与我在ListView.RetrieveVirtualItem上设置的相同委托。

class Report {
   [...]
   // Called when the content of an VirtualItem is needed.
   public event RetrieveVirtualItemEventHandler RetrieveVirtualItem;
   [...]

   private AddRows() {
      for (int i = 0; i < GetItemCount(); i++) 
         AddRow(GetItem(i));
   }

   private ListViewItem GetItem(n) {
      if (_listView.VirtualMode)
         return GetVirtualItem(n);
      return _listView.Items[n];
   }

    private ListViewItem GetVirtualItem(int n)
    {
        if (RetrieveVirtualItem == null)
            throw new InvalidOperationException(
                "Delegate RetrieveVirtualItem not set when using ListView in virtual mode");

        RetrieveVirtualItemEventArgs e = new RetrieveVirtualItemEventArgs(n);
        RetrieveVirtualItem(_listView, e);
        if (e.Item != null)
        {
            return e.Item;
        }
        throw new ArgumentOutOfRangeException("n", "Not in list");
    }

   private static int GetItemsCount()
   {
      if (_listView.VirtualMode)
          return _listView.VirtualListSize;
      return _listView.Items.Count;
   }
}

答案 3 :(得分:1)

您始终可以将基础列表公开给外界:

foreach (object o in virtListView.UnderlyingList)
{
  reportModule.DoYourThing(o);
}