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