LV_ITEM and how to retrieve lParam with GetItem or GetItemD
Carlos Morales Mengotti -- cmengot@arrakis.es Monday, April 29, 1996 MFC 4.0/Win 95 Using a ClistCtrl report view, I populated the list with a LV_ITEM with = mask =3D=20 LVIF_TEXT | LVIF_PARAM; with the contents of a table from a database that= worked=20 very well and the .lParam stored his value that it's a key for another ta= ble(I=20 put a TRACE on that to be sure). Later in the flow of the program the user can select a item and the .lPar= am it=B4s=20 needed to seek the other table. For that I use the following code (Of course I'am building in debug setti= ng) -------------------------------------------------------------------------= ----- void CAgregarCitas::OnItemchangedListUnirContactos(NMHDR* pNMHDR, LRESULT= *=20 pResult)=20 { NM_LISTVIEW* pNMListView =3D (NM_LISTVIEW*)pNMHDR; // TODO: Add your control notification handler code here #ifdef _DEBUG LV_ITEM lvitem; lvitem.mask =3D LVIF_PARAM | LVIF_STATE ;=09 lvitem.iSubItem =3D 0; lvitem.iItem =3D pNMListView->iItem;=09 lvitem.stateMask =3D LVIS_SELECTED;=20 if (!m_ListaDeContactosNotas.GetItem(&lvitem) ) TRACE("GetItem no me funciona!!\n"); else { if (lvitem.state =3D=3D LVIS_SELECTED) { TRACE("LVIS_SELECTED me da positivo\n"); TRACE("El Item es el: %d\n", lvitem.iItem); TRACE("La key es el n=FAmero %ld\n", lvitem.lParam);=09 } } #endif =09 =09 =09 *pResult =3D 0; } -------------------------------------------------------------------------= -------- Well lvitem.lParam it's always 0, lvitem.iItem has the rigth value. if I = change=20 the .mask to get the lvitem.pszText value, that worked also, but I'm unab= le to=20 retrieve the .lParam. If I use the CListCtrl::GetItemData the DWORD data it's also 0. It's my first work with CListCtrl and I'm sure that I making something wr= ong. Thanks --=20 ---------------------------- Carlos Morales Mengotti C++ & Electronic Publishing cmengot@arraki.es cmengot@ran.es Apartado 23 28210 Valdemorillo (Spain) 34 - 1 - 897.78.68 34 - 1 - 316.11.13 ----------------------------
Norman L Covington -- doubleM@cris.com Monday, April 29, 1996 Carlos Morales Mengotti wrote: >=20 > MFC 4.0/Win 95 >=20 > Using a ClistCtrl report view, I populated the list with a LV_ITEM wit= h mask =3D > LVIF_TEXT | LVIF_PARAM; with the contents of a table from a database th= at worked > very well and the .lParam stored his value that it's a key for another = table(I > put a TRACE on that to be sure). > Later in the flow of the program the user can select a item and the .lP= aram it=B4s > needed to seek the other table. > For that I use the following code (Of course I'am building in debug set= ting) >=20 > ----------------------------------------------------------------- ------------- > void CAgregarCitas::OnItemchangedListUnirContactos(NMHDR* pNMHDR, LRESU= LT* > pResult) > { > NM_LISTVIEW* pNMListView =3D (NM_LISTVIEW*)pNMHDR; > // TODO: Add your control notification handler code here >=20 > #ifdef _DEBUG > LV_ITEM lvitem; > lvitem.mask =3D LVIF_PARAM | LVIF_STATE ; > lvitem.iSubItem =3D 0; > lvitem.iItem =3D pNMListView->iItem; > lvitem.stateMask =3D LVIS_SELECTED; > if (!m_ListaDeContactosNotas.GetItem(&lvitem) ) > TRACE("GetItem no me funciona!!\n"); > else > { > if (lvitem.state =3D=3D LVIS_SELECTED) > { > TRACE("LVIS_SELECTED me da positivo\n"); > TRACE("El Item es el: %d\n", lvitem.iItem); > TRACE("La key es el n=FAmero %ld\n", lvitem.lPa= ram); > } >=20 > } >=20 > #endif >=20 >=20 >=20 >=20 > *pResult =3D 0; > } > ----------------------------------------------------------------- ---------------- > Well lvitem.lParam it's always 0, lvitem.iItem has the rigth value. if = I change > the .mask to get the lvitem.pszText value, that worked also, but I'm un= able to > retrieve the .lParam. >=20 > If I use the CListCtrl::GetItemData the DWORD data it's also 0. > It's my first work with CListCtrl and I'm sure that I making something = wrong. >=20 > Thanks >=20 > -- > ---------------------------- > Carlos Morales Mengotti > C++ & Electronic Publishing > cmengot@arraki.es > cmengot@ran.es > Apartado 23 > 28210 Valdemorillo (Spain) > 34 - 1 - 897.78.68 > 34 - 1 - 316.11.13 > ---------------------------- Carlos: Use: m_ListCtrl.SetDataItem(iItem, (DWORD)lID); In my application I do this at the time I am transferring the=20 data from the table to the list control. I grab the primary key,=20 which is a long. Then during, let's say a OnItemchanged() message, I grab the lID=20 from the data: long lID =3D (long)m_ListCtrl.GetDataItem(iITem) or just (long)m_ListCtrl.GetDataItem(iItem) within the argument of the=20 function; however, I may use it more than once, so to save the=20 function call repeatedly, I bring it into a auto variable. at this point you can pass the lID to another table to see if it=20 is at some particular state, or whatever. The iItem is found=20 within the structure passed to the message handler, although you=20 may have to cast depending on which message handler you are=20 using. The best sample MSVC has on the ListCtrl interfacing with a=20 database is DAOVIEW, he uses a ListView there, but same=20 principles. I hope this helps, Norman L Covington doubleM@concentric.com
| Вернуться в корень Архива |