關於Combobox SetItemData與GetItemData

今天寫代碼,發現個奇怪的問題

代碼如下

CString str[] = {L"a",L"b",L"c"}
for (int x = 0;x<3;x++)
{
	m_box.AddString(str[i]);
	m_box.SetItemData(i,(DWORD)(&str[i]));
}

DWORD dwOrd = m_box.GetItemData(m_box.GetCurSel());


此時發現無論怎麼讀,都只有最後一個有數值,經過仔細分析,問過度娘後,發現問題所在


修改代碼如下


CString str[] = {L"a",L"b",L"c"}
for (int x = 0;x<3;x++)
{
	int iAddString = m_box.AddString(str[i]);
	m_box.SetItemData(iAddString ,(DWORD)(&str[i]));
}

DWORD dwOrd = m_box.GetItemData(m_box.GetCurSel());

至此,所有數據正常


以下是另外一個兄弟撰寫,在此留個烙印


SetItemData:是將ComBox中各項的序號和自己需要的東東相關聯(CString,int,double都可以)

它的第二個參數是DWORD所以當需要和CString相關聯的時候,需要把第二個參數賦值爲一個指向CString的指針,

例如://初始化paywany_combox

for (int i = 0;i < 3;i++)

{

   ((CComboBox*)GetDlgItem(IDC_COMBO_PAYWAY))->InsertString(i,payway[i]);

   ((CComboBox*)GetDlgItem(IDC_COMBO_PAYWAY))->SetItemData(i,(DWORD)(&payway[i]));

}

((CComboBox*)GetDlgItem(IDC_COMBO_PAYWAY))->SelectString(-1,payway[0]);


當需要得到用戶所選的項目內容時,使用GetItemData,例如:

CComboBox* pay = (CComboBox*)(this->GetDlgItem(IDC_COMBO_PAYWAY));

CString p = *((CString*)pay->GetItemData(pay->GetCurSel()));


問題與解答:

1.如果放入combox的數據不在本地,GetItemData會在CloneData出錯

   解決:例如:數據存放在全局變量 vector<CString> s_commodity;中那麼在其他地方SetItemData後,在另外一個地方想取的時候不可使用GetItemData,直接將數據的index和全局數據相對應,如:m_name = s_commodity.at(c->GetCurSel());



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章