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

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

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

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

Ответы [ 4 ]

13 голосов
/ 28 августа 2011

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

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

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

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

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

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

2 голосов
/ 09 октября 2010

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

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

0 голосов
/ 06 декабря 2013

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

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

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

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

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

...