CComboBox.GetItemData的倒数是多少?

时间:2010-04-12 21:00:18

标签: c++ mfc combobox

我没有将对象与组合框项目相关联,而是将表示选择的long ids 关联起来。它们来自数据库,所以无论如何这样做似乎很自然。现在,我坚持id而不是用户选择的index,以便在会话中记住选择。如果数据库中不再存在id - 没什么大不了的。选择将被搞砸一次。但是,如果db没有改变,那么它将取得巨大的成功;)

以下是我获取ID的方法:

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

如何扭转此问题?当我为用户的最后一个选择加载存储的值时,我需要将该id转换为索引。我能做到:

cmbSomething.SetCurSel(chosenSomethingIndex);

但是,如果我有一个id,我怎么能尝试(可能不存在)获取索引?

我正在寻找GetItemData

的互惠函数

我正在使用VS2008,可能是最新版本的MFC,无论是什么。

谢谢。

编辑:

啊,废话。看起来我需要这样做:

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

2 个答案:

答案 0 :(得分:1)

SetItemData(DWORD)SetItemDatPtr(void*) IIRC。

答案 1 :(得分:1)

您有一个将项索引映射到数据库ID的函数。该函数没有内置逆,因为一般情况下没有逆。单个数据值可能映射到列表控件中的许多不同项;操作系统不知道您的数据值是唯一的。

除非您在其他地方存储了其他信息,否则逐个搜索控件的方法是唯一的方法。在填充组合框时,可以在std::map中构建反向索引。当您添加带有数据库ID 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;
}