Элементы управления виртуальным списком (MFC) - PullRequest
1 голос
/ 09 октября 2008

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

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

Ответы [ 4 ]

5 голосов
/ 09 октября 2008

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

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

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

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

Или что-то подобное.

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

1 голос
/ 09 октября 2008

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

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

1 голос
/ 09 октября 2008

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

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

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

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

1 голос
/ 09 октября 2008

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

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

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

...