Как заполнить ListView в виртуальном режиме асинхронно? - PullRequest
4 голосов
/ 03 декабря 2008

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

1 Ответ

9 голосов
/ 03 декабря 2008

Ваш обработчик 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

Надеюсь, это поможет.

...