Не удается получить доступ к выбранной коллекции элементов, когда ListView находится в виртуальном режиме?

У меня есть ListView в виртуальном режиме. Я хочу получить доступ SelectedItems имущество.
Но когда я использую ListView1.SelectedItems Я получаю следующее исключение:

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

Как я могу получить доступ к ListView1.SelectedItems в виртуальном режиме.

4 ответа

Решение

Я сделал это с помощью следующего кода, но есть исключение, когда выбрано более одного элемента:

Индекс был вне диапазона. Должен быть неотрицательным и меньшим, чем размер коллекции. Имя параметра: индекс

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--)
{
    …
}

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

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

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

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

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

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

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

Из документов

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

Если вы сохраняете все элементы в списке и используете этот список для передачи элемента в 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()
Другие вопросы по тегам