Могу ли я удалить элементы из ComboBox без изменения индекса других элементов? - PullRequest
1 голос
/ 15 октября 2010

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

Когда заполнено поле со списком, данные элементаустановить так:

index = mycombo.AddString(temp);
mycombo.SetItemData(index, static_cast<DWORD>(count));

, где count - счетчик цикла, и должен быть равен index

Теперь я хочу удалить некоторые элементы позже, но мне нужноИндекс каждого оставшегося элемента остается прежним.CComboBox::DeleteString(UINT nIndex) что я должен использовать?Документация гласит:

Все элементы, следующие за nIndex, теперь перемещаются на одну позицию вниз.Например, если поле со списком содержит два элемента, удаление первого элемента приведет к тому, что оставшийся элемент теперь будет на первой позиции.nIndex = 0 для элемента в первой позиции.

Это говорит о физическом местоположении в раскрывающемся меню или о значении индекса, связанного с элементом?

есть другая функция, которая делает то, что мне нужно?Еще одно решение?

Ответы [ 3 ]

2 голосов
/ 15 октября 2010

Это говорит о физическом местоположении в раскрывающемся меню или о значении индекса, связанного с элементом?

Для ComboBox (а также ListBox, List Control и, возможно, многих других подобных вещей) расположение элемента в элементе управления напрямую связано с его индексом. Индекс является местоположением. В самом деле, просто подумайте, как будто ComboBox был реализован внутри с использованием простого std :: vector. Вы не можете удалить запись из вектора, не влияя на индексы всех последующих записей, и то же самое с этими элементами управления.

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

Скажем, вы создали две записи: первая с индексом 0 имеет text = "A" и ItemData = 0; в то время как второй по индексу 1 имеет text = "B" и ItemData = 1. Если вы затем удалите эту первую запись, вторая запись сместится вниз по заявке на индекс, и ее ItemData будет перемещаться. Таким образом, у вас останется одна запись с индексом 0, имеющая text = "B" и ItemData = 1.

2 голосов
/ 18 октября 2010

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

Индекс всегда изменяется от 0 до (number_of_items-1), и вы ничего не можете с этим поделать.

Тем не менее, данные об элементе всегда остаются с элементом, и именно на это следует обратить внимание при поиске определенного элемента. Не его индекс и не его строка. Посмотрите на данные товара. Индекс может измениться, если вы добавляете, удаляете или прибегаете к элементам. Строки изменится, если вы локализуете программное обеспечение. Поэтому используйте данные, чтобы правильно идентифицировать каждый элемент.

Вы можете взглянуть на http://www.flounder.com/combobox.htm,, где вы можете найти лучшее объяснение, с некоторыми примерами и кодом для более удобной работы со списками.

1 голос
/ 15 октября 2010

Добавление или удаление элементов не изменяет число, которое вы передали SetItemData (). GetItemData () возвращает тот же номер. Однако вам необходимо передать индекс элемента в DeleteString (). Если элементы с меньшими номерами были удалены ранее, индекс больше не будет соответствовать GetItemData (). Если вы потеряли отслеживание индекса определенного элемента, который вы хотите удалить, вам нужно выполнить итерацию элементов, чтобы найти его обратно.

...