我有一个报告模块,可以从ListViews创建PDF报告。
现在,我在虚拟模式下有一个ListView,因此我无法遍历Items集合。
如何从报告模块中循环列表视图中的所有元素?
我可以获得VirtualListSize
属性,因此我知道列表中有多少元素。
我可以以某种方式明确地调用RetreiveVirtualItem
吗?
报告模块不了解ListView中的底层列表。
答案 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);
}