我有一個虛擬模式下的ListView。我想訪問SelectedItems
屬性。
但是當我使用ListView1.SelectedItems
,我收到以下異常:當ListView處於虛擬模式時,無法訪問選定的項目集合?
Cannot access the selected items collection when the ListView is in virtual mode
如何訪問到ListView1.SelectedItems
在VirtualMode。
我有一個虛擬模式下的ListView。我想訪問SelectedItems
屬性。
但是當我使用ListView1.SelectedItems
,我收到以下異常:當ListView處於虛擬模式時,無法訪問選定的項目集合?
Cannot access the selected items collection when the ListView is in virtual mode
如何訪問到ListView1.SelectedItems
在VirtualMode。
我已經通過下面的代碼做了它,但它有一個例外,當選擇多個項目:
指數超出範圍。必須是非負數且小於集合的大小。 參數名稱索引:
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--)
{
…
}
這是因爲每次刪除集合中的項目時,如果您不從最大索引到最小索引進行迭代,索引將會更改。
從docs
在虛擬模式下,該項目集合被禁用。嘗試訪問它會導致InvalidOperationException。 CheckedItems集合和SelectedItems集合也是如此。如果要檢索選定或檢查的項目,請改爲使用SelectedIndices和CheckedIndices集合。
你能否發表一個示例代碼?謝謝。 – 2010-10-09 07:13:42
這是一個很老的帖子,但也許別人會受益。
只需使用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 – 2014-06-19 12:09:23
這應該被標記爲接受的答案 – Jesse 2017-04-19 19:32:20
我你存儲在列表中的所有項目,並使用該列表中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()
檢查:http://stackoverflow.com/questions/444727/loop-through-all-elements-in-a-listview-in-virtual-mode – 2010-10-08 20:55:14