我没有将对象与组合框项目相关联,而是将表示选择的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;
}
}
答案 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;
}