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