2010-10-08 2 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-listview-in-virtual-mode –

ответ

-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]; 
} 

Всякий раз, когда вы удалите пункт (ы) из коллекции, всегда итерацию с самого большого индекса наименьшим индексом, например:

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

Это происходит потому, что каждый раз, когда вы удаляете элемент в коллекции, индекс изменяется, если вы не перебираете от самого большого к наименьшему индексу.

2

Из docs

В виртуальном режиме, коллекция предметов отключена. Попытка доступа к нему приводит к исключению InvalidOperationException. То же самое можно сказать о коллекции CheckedItems и коллекции SelectedItems. Если вы хотите получить выбранные или отмеченные элементы, вместо этого используйте коллекции SelectedIndices и CheckedIndices.

+2

Не могли бы вы разместить образец кода? Благодарю. –

11

Это довольно старый пост, но, возможно, кому-то это принесет пользу.

Просто используйте ListView.SelectedIndexCollection col = listView.SelectedIndices; Затем вы можете доступ к элементу:

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

..но вы не сможете перебрать ListView.Items с использованием Еогеаспа, потому что нет итератора в этом режиме. Использование индексатор просто летать штраф :-)

При попытке использовать Еогеасп вы получите исключение:

Когда ListView находится в виртуальном режиме, вы не можете перечислить через коллекцию ListView элементов с помощью нумератор или вызовите GetEnumerator. Вместо этого используйте индексатор элементов ListView и обращайтесь к элементу по индексу .

+1

только то, что я искал, работает. +1 –

+0

Это должно быть отмечено как принятый ответ – Jesse

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