2011-05-12 48 views
0

如何在虛擬模式下枚舉ListView?如何在虛擬模式下枚舉ListView?

我正在使用OfType<>()方法枚舉列表視圖項目。但是,當它處於虛擬模式時,它將拋出異常,列表視圖無法枚舉。

這裏是我的代碼

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

那麼,如何得到ListView的項目時,它是在虛擬模式?

請發表我的方式,使用.OfType提前<>

感謝

回答

2

當它在虛擬模式下,你不能得到項目從列表視圖,因爲項目不按列表視圖。這就是虛擬模式的重點。

取而代之的是,您持有這些項目,並且列表視圖會詢問它需要顯示項目的信息。如果您正在虛擬模式下成功操作列表視圖,那麼您幾乎可以肯定已將某些列表中的項目放在某處。

documentation報價:

VirtualMode屬性設置爲 真正把ListView控件到虛擬 模式。在虛擬模式下,正常的 Items集合未使用。相反, ListViewItem對象創建爲 動態,因爲ListView需要 他們。

在許多情況下,虛擬模式可能很有用。如果一個ListView對象 必須從已經在內存中的非常大的集合 填充,則創建 對於每個條目 ,ListViewItem對象可能是浪費的。在虛擬模式下,僅需要創建所需項目 。在 其他情況下, ListViewItem對象的值可能需要經常重新計算 ,並且做 這樣對於整個集合會產生不可接受的性能 。在 虛擬模式下,僅計算所需項目 。

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); 

然而(再次),如果列表是虛擬的,它可能有大量的項目,因此這可能需要一段時間:)