Элементы управления виртуальным списком (MFC)

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

Мне сказали, что я могу использовать элемент управления виртуальным списком, но MSDN не очень дружелюбен, может ли кто-нибудь объяснить мне, как я могу использовать элемент управления виртуальным списком для этого?

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
0
3 194
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Ответ принят как подходящий

Откровенно говоря, привязка данных (позиция в вашем векторе данных) к представлению данных в элементе управления списком (позиция в списке ctrl) - это то, от чего я бы держался подальше.

В MFC каждый элемент управления имеет переменную-член DWORD «Данные» - при кодировании в MFC я всегда вызывал «SetItemData» для каждого элемента, добавленного и переданного в указателе, на который ссылается соответствующая строка, например YourListCtrl.SetItemData((DWORDPTR)&YourData);

Затем, когда выбран элемент ListCtrl, вы просто вызываете

DataTypeYouWant* pData = (DataTypeYouWant*)(YourListCtrl.GetItemData(indexofselecteditem));

Или что-то в этом роде.

В качестве альтернативы - если вы не хотите использовать указатели - сохраните индекс элемента в исходном векторе в данных элемента для своей строки (просто передайте его в приведенный выше fns).

+1 Это решит вашу проблему с сортировкой. Данные владельца (виртуальные) - это не ответ.

Aidan Ryan 09.10.2008 23:18

Чтобы использовать виртуальный элемент управления списком, установите стиль LVS_OWNERDATA. Затем вам нужно обработать сообщение уведомления LVN_GETDISPINFO (которое отправляется через WM_NOTIFY).

В этом случае вы несете полную ответственность за данные, включая порядок их отображения. Следовательно, решать вам сортировку и так далее.

Безусловно, самый простой способ - просто использовать данные элемента для установки / получения идентификатора, который можно использовать для извлечения исходных данных, будь то векторный индекс или указатель на данные, или даже ключ в ассоциативный контейнер.

Это действительно зависит от требуемой производительности.

Я лично видел Существенное увеличение производительности для списков, содержащих огромное количество данных. Однако это намного больше работы для реализации, поэтому для простых применений с небольшим количеством данных я рекомендую держаться от него подальше.

По сути, с элементами управления виртуальным списком происходит то, что ваши данные находятся где-то в какой-то собственной структуре данных. Поскольку в представлении списка отображается только небольшое подмножество всех данных, оно запрашивает у вас контент для отображения, когда когда-либо что-то происходит (требуется перерисовка, прокрутка вверх или вниз, изменение сортировки и т. д.).

У меня нет для вас удобных примеров. Но вы можете посмотреть codeguru, я уверен, что есть очень хорошие примеры для начала.

Назначение элементов управления виртуальным списком совершенно иное: вы должны использовать его по соображениям производительности, когда у вас МНОГО элементов в вашем списке (я бы сказал, 2500+).

В вашем случае все, что вам нужно, это сохранить векторный индекс в данных элемента списка, как объясняет NotJarvis.

Другие вопросы по теме