2008-12-03 1 views
4

Я хотел бы отображать записи из нашей базы данных в списке - но получение может занять много времени. Я могу использовать RetrieveVirtualItem, чтобы сообщить мне, когда нужен новый ListViewItem, добавьте фиктивный элемент и начните извлечение; но что мне делать с записью, когда база данных вернет ее? Я не могу обновить коллекцию Items ListView, пока ListView находится в VirtualMode. Есть ли способ сообщить ListView перезагрузить элемент? Или я могу просто сохранить ссылку на ListViewItem и заполнить это? Если бы ни один из них не работал, как еще я мог бы заполнить ListView в виртуальном режиме асинхронно?Как заполнить ListView в виртуальном режиме асинхронно?

ответ

9

Обработчик RetrieveVirtualItem вызывается, когда ListView нуждается в обновлении. Если ваши данные еще не доступны, и вы не можете дождаться, вам придется создать фиктивный элемент (без обработки RetrieveVirtualItem создаст исключение).

Как только ваши данные готовы, вы можете аннулировать элемент управления - это снова вызовет RetrieveVirtualItem для каждого из видимых элементов. В качестве альтернативы недействительности всего контроля, вы можете контролировать, какие элементы должны быть перерисовано с использованием методы RedrawItems элемента управления ListView, который работает в виртуальных и обычных режимах:

http://msdn.microsoft.com/en-us/library/system.windows.forms.listview.redrawitems.aspx

Это звучит, как это может стоить скачивать свои записи партиями, если это займет некоторое время. Кроме того, если ваши операции с базами данных являются дорогостоящими, это хорошо стоит исследовать кэширование ваших ListItems (есть событие CacheVirtualItems вам нужно обращаться):

http://msdn.microsoft.com/en-us/library/system.windows.forms.listview.cachevirtualitems.aspx

Я надеюсь, что это помогает.