2008-10-04 3 views
1

Итак, у меня есть ListView с верхним пределом около 1000 элементов. Мне нужно иметь возможность фильтровать эти элементы, используя событие TextChanged текстового поля. У меня есть код, который хорошо работает для меньшего количества элементов (~ 400), но когда мне нужно повторно отобразить полный список из 1000 предметов, это занимает около 4 секунд.Как эффективно фильтровать большой LIstViewItemCollection?

Я не создаю новые элементы ListViewItems каждый раз. Вместо этого я сохраняю список полной коллекции предметов, а затем добавляю из нее. Кажется, что метод .Add занимает много времени. Вот немного пример:

this.BeginUpdate(); 
foreach (ListViewItem item in m_cachedItems) 
{ 
    MyListView.Add(item); 
} 
this.EndUpdate; 

Я пробовал только добавив недостающие элементы (то есть, разница между отображаемыми элементами в настоящее время и в общем списке элементов), но это не работает. Может быть ситуация, когда в настоящее время отображается только один элемент, пользователь очищает текстовое поле, и мне нужно отобразить весь список.

Я не очень опытен в производительности eecing из элементов управления .NET с большим примером, подобным этому, поэтому я действительно не знаю, как лучше это сделать. Есть ли способ использования метода .Add(), или если нет, просто лучшее общее решение?

ответ

2

Есть две вещи, для решения этой проблемы:

  1. Выключайте сортировочные манипулируя содержимое списка.
  2. Скрыть список, чтобы он не рисовал.

1-я точка - это наибольшее усиление производительности при манипулировании списками из этих двух. Для этого просто установите для ListViewItemSorter значение null в течение времени модификации и установите его в конце.

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

4

Существует лучший способ, вы можете использовать VirtualMode в виде списка.

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

+0

Это даст лучшую производительность, но может быть намного больше работы. Я подозреваю, что список из нескольких сотен, проще всего отключить сортировку, пока список изменен. – 2008-10-04 01:56:28

+0

Я бы не стал больше работать - просто больше работы. Несомненно, примеры Microsoft делают это очень похожим, но они всегда смешны. :-) – 2008-10-04 02:01:45

0

Также обратите внимание, что вы можете скрыть предметы и сделать их невидимыми, не удаляя их. Итак, добавьте все свои предметы в первый раз, а затем позже вы просто спрячете те, которые больше не нужны, и покажите те, которые есть.

3

AddRange гораздо быстрее, чем добавить

MyListView.AddRange(items) 
Смежные вопросы