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 :

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));
}
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
 
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 ne récupère rien dans pNewTypeForm. Quelqu'un a-t-il une idée?

Je vous remercie d'avance