[EVC++] Problème de récupération d'item dans une CtrlList

Problème de récupération d'item dans une CtrlList [EVC++] - C++ - Programmation

Marsh Posté le 17-06-2002 à 17:10:50    

J'ai une liste avec 3 colonnes. Je sais récupérer les évenements sur chacune des colonnes, mais sur les 2 dernières colonnes, je ne peux pas récupérer l'item (je récupère -1). Alors que ca marche parfaitement sur la première colonne...

Reply

Marsh Posté le 17-06-2002 à 17:10:50   

Reply

Marsh Posté le 17-06-2002 à 17:12:00    

Quel est-ton code pour récupérer l'item ?


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
Reply

Marsh Posté le 17-06-2002 à 17:19:04    

Pour insérer les données :
 

Code :
  1. int nIndex = theCtrl.InsertItem(i++,donnee1); // j'insère un item  
  2. theCtrl.SetItemText(nIndex,1,donnee2); //2e colonne de la ligne  
  3. theCtrl.SetItemText(nIndex,2,donnee3); //3e colonne de la ligne  
  4. theCtrl.SetItemData(nIndex, (DWORD)pConsultant ); //faire correspondre une data à l'item


 
Pour récupérer :
 

Code :
  1. if( pNMLISTVIEW->iSubItem == 1)
  2. {
  3.  if( pNMLISTVIEW->iItem != -1 )
  4.  {
  5.   //2eme colonne de l'item cliqué
  6.   CConsultant* pConsultant = (CConsultant *)theCtrl.GetItemData(pNMLISTVIEW->iItem);
  7.  }
  8. }


Message édité par raph77 le 17-06-2002 à 17:19:29
Reply

Marsh Posté le 17-06-2002 à 17:32:29    

C normal, ton test n'est pas bon :
if( pNMLISTVIEW->iSubItem == 1)
{
 
}
 
comme tu as plus d'une colonne, iSubItem ne sera pas egale a 1!

Reply

Marsh Posté le 17-06-2002 à 17:46:15    

Ben iSubItem correspond au numéro de la colonne (0, 1, 2), puisque si je met un truc du style :
 

Code :
  1. if( pNMLISTVIEW->iSubItem == 0) {
  2. AfxMessageBox(_T("colonne 0" ));
  3. }
  4. if( pNMLISTVIEW->iSubItem == 1) {
  5. AfxMessageBox(_T("colonne 1" ));
  6. }
  7. if( pNMLISTVIEW->iSubItem == 2) {
  8. AfxMessageBox(_T("colonne 2" ));
  9. }


 
J'obtiens bien les bons numéros de colonne.

Reply

Marsh Posté le 17-06-2002 à 18:01:32    

Il y a un truc qui me parait bizarre dans ton code.
moi j'aurai mis

Code :
  1. int nIndex = theCtrl.InsertItem(nIndex, donnee1); // j'insère un item   
  2. theCtrl.SetItemText(nIndex,1,donnee2); //2e colonne de la ligne   
  3. theCtrl.SetItemText(nIndex,2,donnee3); //3e colonne de la ligne   
  4. theCtrl.SetItemData(nIndex, (DWORD)pConsultant ); //faire correspondre une data à l'item

 
[cpp]  
 
Comme tu as fais, je pense que les colonnes 2 et 3 vont etre decalees d'une ligne par rapport a la colonne 1.

Reply

Marsh Posté le 18-06-2002 à 10:57:48    

try58, j'ai essayé ton code, mais toujours la même chose, je récupère l'item uniquement sur la première colonne. Pour les autres colonnes je récupère bien dans iSubItem le num de la colonne.
 
Help :cry:

Reply

Marsh Posté le 18-06-2002 à 11:09:35    

raph77 a écrit a écrit :

try58, j'ai essayé ton code, mais toujours la même chose, je récupère l'item uniquement sur la première colonne. Pour les autres colonnes je récupère bien dans iSubItem le num de la colonne.
 
Help :cry:  




Montre le code de toute ta fonction qui te permet de remplir ta CListCtrl. Je pense que c'est a ce niveau qu'il y a un pb.

Reply

Marsh Posté le 18-06-2002 à 11:12:02    

Code :
  1. CManagerDoc* pDoc = (CManagerDoc *)GetDocument();
  2. CListCtrl& theCtrl = GetListCtrl();
  3. int i = 0;
  4. int nIndex = 0;
  5. UpdateColonne();
  6. theCtrl.DeleteAllItems();
  7. pDoc->beginConsultant(pListe);
  8. if( pDoc != NULL ) {
  9.  // On commence le parcours de la liste
  10.  while( pDoc->hasConsultant() ) {
  11.   CConsultant* pConsultant = pDoc->getNextConsultant(pListe);
  12. //   int nIndex = theCtrl.InsertItem(i++,pConsultant->getNomItem() );
  13.   nIndex = theCtrl.InsertItem(nIndex,pConsultant->GetCVName() );
  14.   theCtrl.SetItemText(nIndex,2,GetInfoCons(pConsu
  15. ltant));
  16.   theCtrl.SetItemText(nIndex,1,pConsultant->getNo
  17. mItem());
  18.   theCtrl.SetItemData(nIndex, (DWORD)pConsultant );
  19.  }
  20. }


 
Ca doit etre plus ou moins ça ;)

Reply

Marsh Posté le 18-06-2002 à 11:17:59    

Code :
  1. theCtrl.SetItemData(nIndex, (DWORD)pConsultant );


 
A quoi sert cette ligne de code ? C'est bien pour assigner la data à l'item (à la ligne en fait) ?

Reply

Marsh Posté le 18-06-2002 à 11:17:59   

Reply

Marsh Posté le 18-06-2002 à 11:33:03    

raph77 a écrit a écrit :

Code :
  1. theCtrl.SetItemData(nIndex, (DWORD)pConsultant );


 
A quoi sert cette ligne de code ? C'est bien pour assigner la data à l'item (à la ligne en fait) ?  




Tout a fait, ca permet de remplir ta CListCtrl avec des donnees (par exemple la valeur d'une variable) et non pas du texte.

Reply

Marsh Posté le 18-06-2002 à 11:42:58    

C'est bien ce que je cherche à faire, avoir un pointeur sur une structure pour pouvoir accès à toutes les infos sur un item.
Pourquoi cela ne marche-t'il pas alors ?? :pt1cable:

Reply

Marsh Posté le 18-06-2002 à 12:00:32    

try58 a écrit a écrit :

 
Tout a fait, ca permet de remplir ta CListCtrl avec des donnees (par exemple la valeur d'une variable) et non pas du texte.  




 
Je me suis plante, ca ne sert pas a remplir la CListCtrl comme je le croyais!!

Reply

Marsh Posté le 18-06-2002 à 12:06:13    

Est ce que ca te pose un probleme si quand tu cliques sur n'importe quelle colonne d'un item, tout la ligne est selectionnee?
Parce que tu peux utiliser ceci :
taliste.SetExtendedSytle(LVS_SELECTROW);
et je pense que tu recuperera la bonne data concernant ton item

Reply

Marsh Posté le 18-06-2002 à 12:11:53    

Le problème c'est que dans ce cas, je ne peux pas effectuer un code différent selon la colonne cliquée non ?

Reply

Marsh Posté le 18-06-2002 à 12:16:59    

raph77 a écrit a écrit :

Le problème c'est que dans ce cas, je ne peux pas effectuer un code différent selon la colonne cliquée non ?  




SetItemData affecte une data pour toute la ligne. Donc avec GetItemData tu recupere la data de la ligne quel que soit la colonne cliquee!

Reply

Marsh Posté le 18-06-2002 à 12:18:46    

Ah ok, mais dans ce cas là, les colonnes sont toujours distinctes ?
 
Je vais essayer ca tout de suite :)

Reply

Marsh Posté le 18-06-2002 à 12:31:58    

Essaie d'utiliser GetItem() au lieu de GetItemData(), peut etre que ca te permettra de recuperer les infos concernant le subitem selectionne.

Reply

Marsh Posté le 18-06-2002 à 12:37:21    

try58 a écrit a écrit :

Est ce que ca te pose un probleme si quand tu cliques sur n'importe quelle colonne d'un item, tout la ligne est selectionnee?
Parce que tu peux utiliser ceci :
taliste.SetExtendedSytle(LVS_SELECTROW);
et je pense que tu recuperera la bonne data concernant ton item  




 
Arf, il ne connait pas LVS_SELECTROW
Ou je peux avoir la liste de ce genre de parametres ?

Reply

Marsh Posté le 18-06-2002 à 12:38:52    

try58 a écrit a écrit :

Essaie d'utiliser GetItem() au lieu de GetItemData(), peut etre que ca te permettra de recuperer les infos concernant le subitem selectionne.  




 
Le problème se situe avant, puisque sur mon pNMLISTVIEW->iItem, j'ai -1 sauf dans la première colonne.

Reply

Marsh Posté le 18-06-2002 à 12:44:23    

raph77 a écrit a écrit :

 
 
Le problème se situe avant, puisque sur mon pNMLISTVIEW->iItem, j'ai -1 sauf dans la première colonne.  




Ta CListCtrl se remplit elle correctement ?

Reply

Marsh Posté le 18-06-2002 à 12:46:37    

Euh oui, visuellement elle est correcte !

Reply

Marsh Posté le 18-06-2002 à 12:48:39    

raph77 a écrit a écrit :

 
 
Arf, il ne connait pas LVS_SELECTROW
Ou je peux avoir la liste de ce genre de parametres ?  




je me suis plante c'est LVS_EX_FULLROWSELECT sinon le lien c'est
http://msdn.microsoft.com/library/ [...] styles.asp

Reply

Marsh Posté le 18-06-2002 à 12:55:47    

Ah ok, effectivement cela fonctionne maintenant !!!
Merci beaucoup :jap:  :jap:

Reply

Marsh Posté le 18-06-2002 à 13:03:12    

de rien  [:milka]

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed