Я использую элемент управления списком для отображения представления элементов в векторе. Когда в списке щелкают по другому элементу управления, отображается информация об этом элементе. Индекс элемента в настоящее время определяется его индексом в элементе управления, однако, если я хочу отсортировать или отфильтровать результаты, это больше не будет работать.
Мне сказали, что я могу использовать элемент управления виртуальным списком, но MSDN не очень дружелюбен, может ли кто-нибудь объяснить мне, как я могу использовать элемент управления виртуальным списком для этого?





Откровенно говоря, привязка данных (позиция в вашем векторе данных) к представлению данных в элементе управления списком (позиция в списке ctrl) - это то, от чего я бы держался подальше.
В MFC каждый элемент управления имеет переменную-член DWORD «Данные» - при кодировании в MFC я всегда вызывал «SetItemData» для каждого элемента, добавленного и переданного в указателе, на который ссылается соответствующая строка, например
YourListCtrl.SetItemData((DWORDPTR)&YourData);
Затем, когда выбран элемент ListCtrl, вы просто вызываете
DataTypeYouWant* pData = (DataTypeYouWant*)(YourListCtrl.GetItemData(indexofselecteditem));
Или что-то в этом роде.
В качестве альтернативы - если вы не хотите использовать указатели - сохраните индекс элемента в исходном векторе в данных элемента для своей строки (просто передайте его в приведенный выше fns).
Чтобы использовать виртуальный элемент управления списком, установите стиль LVS_OWNERDATA. Затем вам нужно обработать сообщение уведомления LVN_GETDISPINFO (которое отправляется через WM_NOTIFY).
В этом случае вы несете полную ответственность за данные, включая порядок их отображения. Следовательно, решать вам сортировку и так далее.
Безусловно, самый простой способ - просто использовать данные элемента для установки / получения идентификатора, который можно использовать для извлечения исходных данных, будь то векторный индекс или указатель на данные, или даже ключ в ассоциативный контейнер.
Это действительно зависит от требуемой производительности.
Я лично видел Существенное увеличение производительности для списков, содержащих огромное количество данных. Однако это намного больше работы для реализации, поэтому для простых применений с небольшим количеством данных я рекомендую держаться от него подальше.
По сути, с элементами управления виртуальным списком происходит то, что ваши данные находятся где-то в какой-то собственной структуре данных. Поскольку в представлении списка отображается только небольшое подмножество всех данных, оно запрашивает у вас контент для отображения, когда когда-либо что-то происходит (требуется перерисовка, прокрутка вверх или вниз, изменение сортировки и т. д.).
У меня нет для вас удобных примеров. Но вы можете посмотреть codeguru, я уверен, что есть очень хорошие примеры для начала.
Назначение элементов управления виртуальным списком совершенно иное: вы должны использовать его по соображениям производительности, когда у вас МНОГО элементов в вашем списке (я бы сказал, 2500+).
В вашем случае все, что вам нужно, это сохранить векторный индекс в данных элемента списка, как объясняет NotJarvis.
+1 Это решит вашу проблему с сортировкой. Данные владельца (виртуальные) - это не ответ.