2010-04-12 46 views
1

代替將對象與組合框項目關聯,我將long代表與代表選項相關聯。他們來自一個數據庫,所以無論如何這樣做似乎很自然。現在,我堅持用戶選擇的id而不是index,以便跨會話記住這一選擇。如果數據庫中不再存在id - 沒什麼大不了的。選擇將會搞砸一次。如果數據庫沒有變化,但是,那麼這將是一個巨大的成功;)CComboBox.GetItemData的倒數是什麼?

這裏是我得到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; 
    } 
} 

回答

1

您有一個將項目索引映射到數據庫ID的功能。該函數沒有內置的反函數,因爲一般情況下不存在反函數。單個數據值可能映射到列表控件中的許多不同項目;操作系統不知道你的數據值是唯一的。

除非您有其他信息存儲在其他地方,否則您一個一個搜索控制項的技術是唯一的方法。當你填充你的組合框時,你可以在std::map中建立一個反向索引。當您與數據庫ID id添加項目i,一個條目添加到您的其他數據結構,太:

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

SetItemData(DWORD)SetItemDatPtr(void*) IIRC。

相關問題