Не удается получить доступ к выбранной коллекции элементов, когда 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()