Bonjour,
Je remplie un CListCtrl grâce à une structure (dans lequel se trouve un id, un libellé et une quantité). J'affiche le libellé et la quantité dans 2 colonnes différentes et je voudrai que mon id soit associé à la ligne de manière à ce que lorque je sélectionne une ligne et que j'appuie sur un bouton, je sache sur quel élément de ma structure je dois travailler.
Je ne peux pas me fier à la position du curseur dans le CListCtrl car les données ne sont pas affichées dans le même ordre qu'elles sont insérées.
J'ai utilisé une discussion de ce forum pour insérer une CString dans le lParam de l'item grâce au SetItemData mais je ne récupère jamais rien.
Voici le code associé :
Initialisation du CListCtrl :
et le code lorsque j'appuie sur mon bouton qui doit me ramener l'id de la ligne :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88 void CReceptionMP::RemplirListScan() { LV_COLUMN lvcolumn; int iSubItem,iActualItem = 0; LV_ITEM lvitem; int index = 0; CString l_mess; TCHAR buffer[61]; SetCursor(AfxGetApp()->LoadStandardCursor(IDC_WAIT)); m_liste.SetRedraw(FALSE); int nColumnCount = m_liste.GetHeaderCtrl()->GetItemCount(); for (int o=0;o < nColumnCount;o++) { m_liste.DeleteColumn(0); } m_liste.DeleteAllItems(); // insertion des colonnes lvcolumn.mask = LVCF_FMT | LVCF_SUBITEM | LVCF_TEXT | LVCF_WIDTH | LVIF_PARAM; lvcolumn.fmt = LVCFMT_LEFT; lvcolumn.pszText = L"Matière Première"; lvcolumn.iSubItem = 0; lvcolumn.cx = 160; m_liste.InsertColumn(0, &lvcolumn); lvcolumn.mask = LVCF_FMT | LVCF_SUBITEM | LVCF_TEXT | LVCF_WIDTH; lvcolumn.fmt = LVCFMT_LEFT; lvcolumn.pszText = L"Qté"; lvcolumn.iSubItem = 1; lvcolumn.cx = 40; m_liste.InsertColumn(1, &lvcolumn); m_liste.DeleteColumn(2); // insertion des valeurs dans les colonnes for (int i=0;i < gNbLgnAtd;i++) { for (iSubItem = 0; iSubItem < 2; iSubItem++) { lvitem.mask = LVIF_TEXT; lvitem.iItem = (iSubItem == 0)? index : iActualItem; lvitem.iSubItem = iSubItem; lvitem.iImage = NULL; switch (iSubItem) { case 0 : l_mess = CString(strliste[i].LibMP); l_mess.TrimRight(); _tcscpy(buffer,(LPCTSTR)l_mess); lvitem.pszText = buffer; break; case 1 : l_mess = CString(strliste[i].QteLgnrecep); l_mess.TrimRight(); _tcscpy(buffer,(LPCTSTR)l_mess); lvitem.pszText = buffer; break; } if (iSubItem == 0) { iActualItem = m_liste.InsertItem(&lvitem); CString IdLgnAtdStr = (CString)strliste[i].IdLgnAtd; CString *pCode = reinterpret_cast<CString*> (m_liste.GetItemData(lvitem.iItem)); if (pCode) delete pCode; pCode = new CString(IdLgnAtdStr); m_liste.SetItemData(lvitem.iItem, reinterpret_cast<DWORD_PTR> (pCode)); index++; } else { m_liste.SetItem(&lvitem); } } } UINT flag = LVIS_SELECTED | LVIS_FOCUSED; m_liste.SetFocus(); m_liste.SetItemState(0, flag, flag); m_liste.SetFocus(); m_liste.SetRedraw(TRUE); SetCursor(AfxGetApp()->LoadStandardCursor(IDC_ARROW)); }
Je ne récupère rien dans pNewTypeForm. Quelqu'un a-t-il une idée?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 void CReceptionMP::OnModifautreparam() { int nItem=-1; POSITION pos = m_liste.GetFirstSelectedItemPosition(); if (pos!= NULL) nItem= m_liste.GetNextSelectedItem(pos); CString *pNewTypeForm = reinterpret_cast<CString*> (m_liste.GetItemData(nItem)); }
Je vous remercie d'avance
Partager