Каков ответ CComboBox.GetItemData? - PullRequest
1 голос
/ 13 апреля 2010

Вместо того, чтобы связывать объекты с элементами поля со списком, я ассоциирую long идентификаторы , представляющие варианты. Они поступают из базы данных, поэтому в любом случае это кажется естественным. Теперь я сохраняю id, а не index выбора пользователя, так что выбор запоминается между сеансами. Если идентификатор больше не существует в базе данных - ничего страшного. Выбор будет испорчен один раз. Однако, если БД не изменится, это будет большой успех;)

Вот как я могу получить идентификатор:

chosenSomethingIndex = cmbSomething.GetCurSel();
lastSomethingId = cmbSomething.GetItemData(chosenSomethingIndex);

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

cmbSomething.SetCurSel(chosenSomethingIndex);

Однако как я могу попытаться (он может не существовать) получить индекс, если у меня есть идентификатор?

Я ищу ответную функцию для GetItemData

Я использую VS2008, возможно, последнюю версию MFC, что бы это ни было.

Спасибо.

EDIT:

Ах, дерьмо. Похоже, мне нужно сделать это:

for (int i = 0; i < nCount; i++) 
{
    if (nId == GetItemData(i)) 
    {
        SetCurSel(i);
        hr = S_OK;
        break;
    }
}

Ответы [ 2 ]

1 голос
/ 13 апреля 2010

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

Ваш метод поиска элементов управления один за другим - единственный способ сделать это, если только у вас нет дополнительной информации, хранящейся где-либо еще. Заполняя поле со списком, вы можете построить обратный индекс в std::map. Когда вы добавляете элемент i с идентификатором базы данных id, добавьте также запись в другую структуру данных:

SetItemData(i, id);
reverse_index[id] = i;

Затем, вместо поиска по одному элементу за раз, вы можете просто посмотреть в индексе, заменив цикл следующим образом:

std::map<DWORD_PTR, int>::iterator it = reverse_index.find(nId);
if (it != reverse_index.end()) {
  assert(GetItemData(*it) == nId);
  SetCurSel(*it);
  hr = S_OK;
}
1 голос
/ 13 апреля 2010

SetItemData(DWORD) или SetItemDatPtr(void*) IIRC.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...