2010-10-08 61 views
4

我有一個虛擬模式下的ListView。我想訪問SelectedItems屬性。
但是當我使用ListView1.SelectedItems,我收到以下異常:當ListView處於虛擬模式時,無法訪問選定的項目集合?

Cannot access the selected items collection when the ListView is in virtual mode 

如何訪問到ListView1.SelectedItems在VirtualMode。

+0

檢查:http://stackoverflow.com/questions/444727/loop-through-all-elements-in-a-listview-in-virtual-mode – 2010-10-08 20:55:14

回答

-3

我已經通過下面的代碼做了它,但它有一個例外,當選擇多個項目:

指數超出範圍。必須是非負數且小於集合的大小。 參數名稱索引:

List<ListViewItem> ListViewItems = new List<ListViewItem>(); 

foreach (int index in listView1.SelectedIndices) 
{ 
    ListViewItem SelectedListViewItem = listView1.Items[index]; // exception 
    ListViewItems.RemoveAt(index); 
} 
… 

void listView1_RetrieveVirtualItem(object sender, RetrieveVirtualItemEventArgs e) 
{ 
    e.Item = ListViewItems[e.ItemIndex]; 
} 

每當你從集合中刪除項目(S),總是從最大的指數迭代,以最小的指數,像這樣:

for (int index = listView1.SelectedIndices.Count - 1; i >= 0; i--) 
{ 
    … 
} 

這是因爲每次刪除集合中的項目時,如果您不從最大索引到最小索引進行迭代,索引將會更改。

2

docs

在虛擬模式下,該項目集合被禁用。嘗試訪問它會導致InvalidOperationException。 CheckedItems集合和SelectedItems集合也是如此。如果要檢索選定或檢查的項目,請改爲使用SelectedIndices和CheckedIndices集合。

+2

你能否發表一個示例代碼?謝謝。 – 2010-10-09 07:13:42

11

這是一個很老的帖子,但也許別人會受益。

只需使用ListView.SelectedIndexCollection col = listView.SelectedIndices; 然後你就可以訪問一個項目:

forearch(var item in col) 
{ 
    string txt = listView.Items[item].Text; 
} 

..但你將無法通過使用的foreach ListView.Items迭代,因爲沒有在此模式下可用的迭代器。使用索引僅僅是飛精細:-)

當試圖使用的foreach你得到一個異常:

當的ListView處於虛擬模式時,你無法通過 的ListView項集合使用枚舉枚舉或調用GetEnumerator。 改爲使用ListView項目索引器,並通過索引 值訪問項目。

+1

正是我正在尋找的作品。 +1 – 2014-06-19 12:09:23

+0

這應該被標記爲接受的答案 – Jesse 2017-04-19 19:32:20

0

我你存儲在列表中的所有項目,並使用該列表中RetrieveVirtualItem 給項目,你可以找到選擇的項目,如以下

Dim lstData As List(Of ListViewItem) = New List(Of ListViewItem) 
Dim lstSelectedItems As List(Of ListViewItem) = lstData.FindAll(Function(lstItem As ListViewItem) lstItem.Selected = True) 
Me.Text = lstItems.Count.ToString()