IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

MFC Discussion :

récupération d'un CString avec GetItemData


Sujet :

MFC

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Août 2006
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 10
    Par défaut récupération d'un CString avec GetItemData
    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

  2. #2
    Membre habitué
    Profil pro
    Inscrit en
    Août 2006
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 10
    Par défaut un peu plus d'infos
    Pour information je viens d'effectuer quelques tests :

    Voila ce que je mets dans la création de mon CListCtrl :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    iActualItem = m_liste.InsertItem(&lvitem);
    m_liste.SetItemData(i,(DWORD)i);
    DWORD blu = m_liste.GetItemData(i);
    Ici je récupère bien la valeur de i dans blu.

    Par contre si j'effectue un GetItemData en dehors de cette fonction, alors je récupère 0 pour tous les items.

    Je n'y comprend vraiment plus rien et vous remercie pour l'attention que vous porterez à ce problème.

  3. #3
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par défaut
    Citation Envoyé par nono22 Voir le message
    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
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    void CReceptionMP::RemplirListScan()
    {
    LV_COLUMN                lvcolumn;
    int                      iSubItem,iActualItem = 0;
    LV_ITEM                  lvitem;
    int						 index = 0;// redondant avec ton index de boucle
    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);
    //    }
           while(nColumnCount>0){
                 nColumnCount--;
                 m_liste.DeleteColumn(nColumnCount);
           }
    
        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); // A quoi ca sert? Déja fait quelques lignes plus haut non?
    
    	// 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*/i : 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;
    */
                           lvitem.pszText = (LPTCSTR)CString(strliste[i].LibMP);
    // ou carrement si le type est bon:
                           lvitem.pszText = strliste[i].LibMP;
                           break;
               case 1 :
    /*
                           l_mess = CString(strliste[i].QteLgnrecep);
                           l_mess.TrimRight();
                           _tcscpy(buffer,(LPCTSTR)l_mess);
                           lvitem.pszText = buffer;
    */
                           lvitem.pszText = (LPTCSTR)CString(strliste[i].QteLgnrecep);
    // ou carrement si le type est bon:
                           lvitem.pszText = strliste[i].QteLgnrecep;
                           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*/iActualItem , 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
    12
    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

  4. #4
    Membre habitué
    Profil pro
    Inscrit en
    Août 2006
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 10
    Par défaut
    Merci beaucoup pour ces corrections, je récupère en effet quelquechose maintenant lorsque je clique sur mon bouton.

    Cependant, il me reste un gros problème.
    ex : je dois insérer une structure qui contient 12 élément avec des Id de 005174 à 005185.
    Si je fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CString *pNewTypeForm = reinterpret_cast<CString*> (m_liste.GetItemData(i));
    juste après mon SetItem j'ai bien la valeur voulue par contre en dehors de ma boucle for (int i=0;i < gNbLgnAtd;i++), je récupère toujours les valeurs 005185ou 005181.

    Code du test effectué :

    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
    for (int i=0;i < gNbLgnAtd;i++)
    
        { 
    
           for (iSubItem = 0; iSubItem < 2; iSubItem++)
    
           {
    
               lvitem.mask = LVIF_TEXT;
    
               lvitem.iItem = (iSubItem == 0)? i : 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(iActualItem , reinterpret_cast<DWORD_PTR> (pCode));
    
               }
    
               else
    		   {
    
    				m_liste.SetItem(&lvitem); 
    				CString *pNewTypeForm = reinterpret_cast<CString*> (m_liste.GetItemData(i));  
    //Ici je récupère bien les valeurs insérées (de 005174 à 005185)
    		   }
    
            }
    	
        }
    
    	for(int j=0;j<gNbLgnAtd;j++)
    	{
    		CString *pNewTypeForm = reinterpret_cast<CString*> (m_liste.GetItemData(j));
    //Ici je récupère parfois 005185 et parfois 005181
    			}
    Merci d'avance à ceux qui se pencheront sur mon problème.

  5. #5
    Membre habitué
    Profil pro
    Inscrit en
    Août 2006
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 10
    Par défaut quelques infos en plus
    Je viens de remarquer que :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    iActualItem = m_liste.InsertItem(&lvitem);
    me renvoie toujours 0, alors que j'initialise lvitem.iItem à i (mon increment dans la boucle for)

    InsertItem ne doit-il pas me renvoyer l'index du nouvel item (càd lvitem.iItem)???

    De plus dans la partie suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    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));
    pCode me retourne toujours l'adresse de l'élément que je viens d'insérer donc il le supprime ce qui explique pourquoi je ne retrouve pas mes bonnes valeurs à la fin.

    Cela va peut-être vous aider à comprendre ce qui pose problème.

    Merci d'avance

  6. #6
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par défaut
    1/J'avoue que je ne vois pas trop l'intérêt du :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    CString *pCode = reinterpret_cast<CString*> (m_liste.GetItemData(lvitem.iItem));
    if (pCode)
       delete pCode;
    vu que tu viens juste d'insérer l'item.
    2/ Ta boucle est maladroite je pense: d'abord tu fais un switch (iSubItem), puis après tu teste sur if(iSubItem==0)... Pourquoi ne pas regrouper les deux. Même, carrément pour quoi cette double boucle? Garde la première boucle sur tes items, puis pour chacun d'entre eux renseigne les colonnes les unes à la suite des autres sans faire de boucle. A mon avis, elle ne sert à rien et même si tu rajoutes des colonnes, tu seras amené à rajouter des case 2, case 3, etc.... Donc sauf à avoir une liste de colonne dynamique, cela ne fait qu'obscurcir ton code.
    3/ Tu peux aussi positionner le itemData quand tu rajoutes ton élément avec InsertItem en utilisant le flag LVIF_PARAM et en remplissant le champs lParam.

  7. #7
    Membre habitué
    Profil pro
    Inscrit en
    Août 2006
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 10
    Par défaut
    Merci pour cette réponse. Je fais le test dès lundi matin.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. récupération d'une ligne avec un select MAX(champ1)
    Par rdams dans le forum Requêtes
    Réponses: 8
    Dernier message: 03/07/2006, 10h33
  2. récupération de données SQL avec C++
    Par krusty++ dans le forum Bibliothèques
    Réponses: 2
    Dernier message: 27/03/2006, 15h10
  3. Réponses: 10
    Dernier message: 13/03/2006, 14h30
  4. Pb récupération d'une somme avec SUM()
    Par momo99 dans le forum InterBase
    Réponses: 3
    Dernier message: 01/11/2005, 15h38
  5. [DOM] Récupération d'un noeud avec critères ?
    Par elitost dans le forum Format d'échange (XML, JSON...)
    Réponses: 1
    Dernier message: 20/10/2005, 15h27

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo