Как перечислить ListView, когда он находится в виртуальном режиме?

#c# #listview #virtualmode

#c# #listview #virtualmode

Вопрос:

Как перечислить ListView, когда он находится в виртуальном режиме?

Я использую OfType<>() метод для перечисления элементов представления списка. Но он выдает исключение, например, представление списка не может быть перечислено, когда оно находится в виртуальном режиме.

Вот мой код

 List<String> lst= myListView.Items.OfType<ListViewItem>().Select(X=>X.Text).ToList(); 
  

Итак, как мне получить элемент из ListView, когда он находится в виртуальном режиме?

Пожалуйста, напишите мне способ использования.OfType<>

Заранее спасибо

Ответ №1:

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

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

Цитирую из документации:

Присвоение свойству VirtualMode значения true переводит ListView в виртуальный режим. В виртуальном режиме обычная коллекция элементов не используется. Вместо этого объекты ListViewItem создаются динамически, как того требует ListView.

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

Ответ №2:

ListViewItemCollection.GetEnumerator() Метод выдает исключение, если он вызывается, когда список находится в виртуальном режиме. Это означает, что вы не сможете получить к ним доступ с помощью любого метода LINQ, включая OfType() .

Однако вы можете просто выполнить простую итерацию списка:

 List<string> lst = new List<string>();
for (int i = 0; i < listView1.VirtualListSize; i  ) {
   lst.Add(listView1.Items[i].Text);
  

Однако (опять же), если список виртуальный, в нем, вероятно, большое количество элементов, так что это может занять некоторое время 🙂

Ответ №3:

 for (int i=0;i< LSTView_Search.Items.Count;i  )
{
  LSTView_Search.Items[i];
}