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

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

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

Вот мой код

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

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

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

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

Ответы [ 2 ]

2 голосов
/ 12 мая 2011

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

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

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

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

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

0 голосов
/ 13 мая 2011

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

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

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

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

...