Connaitre le nombre de subitems différents dans une listview [Résolu]

Messages postés
175
Date d'inscription
lundi 16 décembre 2002
Dernière intervention
8 mai 2017
- - Dernière réponse : cs_Fripouil
Messages postés
175
Date d'inscription
lundi 16 décembre 2002
Dernière intervention
8 mai 2017
- 1 mars 2012 à 15:47
Bonjour,

Je Possede une listview à 2 colonnes dans la premiére j' ai des articles et dans la deuxieme des references.

J' aurais aimais savoir comment compter les subitems différents ( donc les references )?
La ou je n' y arrive pas c' est pour faire une boucle pour controler toute la listview car une même référence peut se trouver n'importe où et donc il ne faut pas la recompter si celle-ci l' a déja était.

Merci par avance.



Fripouil
Afficher la suite 

Votre réponse

20/28 réponses

Meilleure réponse
Messages postés
18039
Date d'inscription
lundi 7 décembre 2009
Statut
Contributeur
Dernière intervention
11 avril 2018
3
Merci
et presque la même vitesse fulgurante avec une collection
Dim toto As New Collection
 For i = 0 To List1.ListCount - 1
     On Error Resume Next
     toto.Add "", List1.List(i)
   Next
   MsgBox toto.Count



____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources a aidé 106 internautes ce mois-ci

Commenter la réponse de ucfoutu
Messages postés
453
Date d'inscription
dimanche 20 août 2006
Dernière intervention
11 janvier 2013
0
Merci
bonjour,

Tu peux trié ta listview puis ensuite bouclé et comptabilisé.
Commenter la réponse de scromania
Messages postés
18039
Date d'inscription
lundi 7 décembre 2009
Statut
Contributeur
Dernière intervention
11 avril 2018
0
Merci
Bonjour,
Je te conseille dans un tel cas et sans la moindre hésitation l'utilisation d'un dictionnaire.
Il te permettra de ne boucler qu'une seule fois et de comptabiliser dans la foulée chaque subitem différent.
D'une énorme souplesse et rapidité.
Ouvre ton aide (MSDN) sur le mot Dictionary


____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
Commenter la réponse de ucfoutu
Messages postés
17308
Date d'inscription
mercredi 2 janvier 2002
Dernière intervention
22 août 2018
0
Merci
HashTable dans le cas présent, ucfoutu, en .Net

Renfield - Admin CodeS-SourceS - MVP Visual Basic & Spécialiste des RegExp
Commenter la réponse de Renfield
Messages postés
17308
Date d'inscription
mercredi 2 janvier 2002
Dernière intervention
22 août 2018
0
Merci
y'a surement une expression LINQ qui pourrait faire l'affaire, là que j'y pense....

à voir.

Renfield - Admin CodeS-SourceS - MVP Visual Basic & Spécialiste des RegExp
Commenter la réponse de Renfield
Messages postés
175
Date d'inscription
lundi 16 décembre 2002
Dernière intervention
8 mai 2017
0
Merci
Bonjour et merci d' avoir répondu.

J' ai regardé ce qu' était une hashtable sur google avec quelques exemples, il a l' air vrai que cela puisse me servir mais étant donné que je suis un "débutant", cela me semble plus compliqué.
Mon idée était de faire une boucle, mémoriser les différentes références puis de les compter mais c' est justement là que je bloque car le seul code que j' ai réussi à pondre était de faire une boucle en vérifiant les subitems et si le subitem x était différent de subitem x - 1 alors un label s' incrémenté de 1 mais biensûr si plus loin dans ma list il y' avait à nouveau une référence déja "vérifier" il me la recomptait ( la solution dans ce cas est de trier ma listview ) mais mon code ne me paraissait pas trés propre d' autant que sur les 106 références pour le moment, il n' en comptait que 105.
Si vous pouvez plus m' aider, mercie encore...

Fripouil
Commenter la réponse de cs_Fripouil
Messages postés
18039
Date d'inscription
lundi 7 décembre 2009
Statut
Contributeur
Dernière intervention
11 avril 2018
0
Merci
Je trouve que tu te compliques bien la tâche, pour ne pas vouloir apprendre (hashtable ou dictionary : même combat)
Mais si tu tiens tellement à te torturer avec tes boucles :
Amuse-toi, mais ainsi (pour ne pas recompter ce que tu as déjà compté) :
A chaque fois que tu rencontres un article identique ==>> tu incrémentes le compteur de 1, tu sors et reprends ta boucle, mais à une ligne en dessous.
Un travail de fou (tant en boucle, que pour garder en mémoire autant de compteurs que d'articles différents)!
Mais c'est ton choix... Alors ... vas-y


____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
Commenter la réponse de ucfoutu
Messages postés
18039
Date d'inscription
lundi 7 décembre 2009
Statut
Contributeur
Dernière intervention
11 avril 2018
0
Merci
ou encore (un peu moins fou, mais toujours pas sage)
Pour chaque article "lu" non vide ==>> faire toute la boucle, comptabiliser les correspondances et les mettre toutes à vide.
Donc une boucle dans la boucle. Mais alors : sur une copie de ta listview , hein (si tu ne veux pas en perdre les données).
Tout cela n'est pas sérieux.


____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
Commenter la réponse de ucfoutu
Messages postés
175
Date d'inscription
lundi 16 décembre 2002
Dernière intervention
8 mai 2017
0
Merci
Oui, je suis sur que tu as raison, je n' en doute pas une seule seconde, le probléme est que je n' y connais pas grand chose et que malgré les exemples que j' ai trouvé aucuns ne me semblent assez explicite pour l' adapter à ce que je veux faire.
Donc y' a comme un dilemme...

Fripouil
Commenter la réponse de cs_Fripouil
Messages postés
17308
Date d'inscription
mercredi 2 janvier 2002
Dernière intervention
22 août 2018
0
Merci
à corriger... j'ai écrit ca de tête, mais en gros, c'est ce que tu cherches :

Dim h as new HashTable
For Each Item as ListItem
    If Not h.Contains(Item.ToString) Then
        h.Add Item.ToString
    End If
Next Item
MessageBox.Show h.Count.ToString()


Renfield - Admin CodeS-SourceS - MVP Visual Basic & Spécialiste des RegExp
Commenter la réponse de Renfield
Messages postés
18039
Date d'inscription
lundi 7 décembre 2009
Statut
Contributeur
Dernière intervention
11 avril 2018
0
Merci
Bonjour, Renfield
J' aurais aimais savoir comment compter les subitems différents

est interprété par moi différemment, cependant.
Toi, tu comptes combien il y a d'articles distincts
Moi, j'ai cru comprendre qu'il voulait le nombre d'articles correspondant à chaque article distinct.
Mais tu as peut-être mieux deviner le but, après tout.

____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
Commenter la réponse de ucfoutu
Messages postés
17308
Date d'inscription
mercredi 2 janvier 2002
Dernière intervention
22 août 2018
0
Merci
ah, peut etre
enfin le fond du probleme n'est pas vraiment là

le listview n'est normallement là que pour l'affichage...

les requetes, extractions etc

sont a faire sur la sources des données...

Renfield - Admin CodeS-SourceS - MVP Visual Basic & Spécialiste des RegExp
Commenter la réponse de Renfield
Messages postés
175
Date d'inscription
lundi 16 décembre 2002
Dernière intervention
8 mai 2017
0
Merci
Bonsoir et merci pour ton aide.
Je vais te déranger un petit peu encore si tu me le permets

Pourrais je avoir des explications sur ton code que je comprenne bien et que cela me reserve dans l' avenir ?

Merci encore


Fripouil
Commenter la réponse de cs_Fripouil
Messages postés
1403
Date d'inscription
mardi 1 mai 2007
Dernière intervention
7 octobre 2012
0
Merci
Bonsoir,

Pourquoi ne pas utiliser un tableau.
L' initialiser avec le premier élélément de la listview.
Et pour chaque élément de la listview, le comparer avec les éléments du tableau.
S' il n' y est pas l' ajouter, sinon passer à l' élément suivant.
Au final, le nombre des subitems différents est le nombre
des éléments ajoutés au tableau.




[] Ce qui va sans dire. va mieux en le disant.
Commenter la réponse de LIBRE_MAX
Messages postés
18039
Date d'inscription
lundi 7 décembre 2009
Statut
Contributeur
Dernière intervention
11 avril 2018
0
Merci
Fripouil vient d'écrire dans un doublon de ce "post" :
J essaie de faire des boucles dans tous les sens ça rame et en plus cela ne fonctionne pas

Il veut donc faire cela à tout prix à laide de boucle (un dico serait mieux, mais bon ...)
On aurait quand-même aimé voir quelques lignes du ode qu'il a tenté. Mais bon ...
En voilà le mécanisme, donc (fort simple), en langage naturel.
Pour I = 0 jusqu'au dernier
   compteur = compteur + 1
   pour J = I + 1 jusqu'au dernier
      si article J article I alors compteur compteur - 1 et quitter cette boucle J
   J suivant
I suivant

Compteur contiendra ainsi bien évidemment forcément le nombre d'articles différents.
A Fripouil d'écrire son code sur cette base fort simple.
____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
Commenter la réponse de ucfoutu
Messages postés
1403
Date d'inscription
mardi 1 mai 2007
Dernière intervention
7 octobre 2012
0
Merci
Bonsoir,

ucfoutu: la solution qui consiste à comparer un item avec les suivants ne fonctionne pas si on prend son exemple.
Le dernier "AA" n' a pas son pareil dans ce qui suit.Pourtant un "AA" se trouve en haut de la liste.Et il a déjà été comparé.Ce qu' il faudrait c' est comparer chaque item avec toute la liste.
Ma somution du tableau est la plus judicieuse.
Le nombre d' itération y est moindre.




[] Ce qui va sans dire. va mieux en le disant.
Commenter la réponse de LIBRE_MAX
Messages postés
18039
Date d'inscription
lundi 7 décembre 2009
Statut
Contributeur
Dernière intervention
11 avril 2018
0
Merci
Bonsoir, LIBRE_MAX
La solution la plus judicieuse est l'utilisation d'un dico, tout simplement (déjà dit). Ou même (mais faut alors une gestion d'erreur : une collection. Ou même (encore) trier (et du coup : une seule boucle suffit.
Ta remarque, par contre est totalement infondée
Je pense que tu n'as pas capté le principe du compteur
Essaye donc.



____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
Commenter la réponse de ucfoutu
Messages postés
18039
Date d'inscription
lundi 7 décembre 2009
Statut
Contributeur
Dernière intervention
11 avril 2018
0
Merci
c'est ce que je souligne ici, qui t'a probablement échappé :
si article J article I alors compteur compteur - 1 et quitter cette boucle J



____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
Commenter la réponse de ucfoutu
Messages postés
1403
Date d'inscription
mardi 1 mai 2007
Dernière intervention
7 octobre 2012
0
Merci
Ta remarque, par contre est totalement infondée

Voilà ce qui dit ton code:
Pour I = 0 jusqu'au dernier
compteur = compteur + 1
Tu incrémentes,alors que tu n' as même pas vérifié si l' item n' a pas éré déjà comptabilisé.


Voilà ce que je dis:
xitem=ListView.ListItems(i)
Redim Preserve T(1)
T(0)=xItem
Compteur=1
Pour i=2 jusqu' au dernier
xitem=ListView.ListItems(i)
trouv=False
Pour j=0 jusqu' à UBound(T)-1
Si xItem=T(j) Alors
trouv=True
Exit Pour
Fin Si
Suivant j
Si trouv=False Alors
Compteur=Compteur+1
Redim Preserve T(Compteur)
T(Compteur-1)=xItem
Fin Si
Suivant i



[] Ce qui va sans dire. va mieux en le disant.
Commenter la réponse de LIBRE_MAX
Messages postés
18039
Date d'inscription
lundi 7 décembre 2009
Statut
Contributeur
Dernière intervention
11 avril 2018
0
Merci
Ah vu .
Tu as raison.
Alors : avec un dico.


____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
Commenter la réponse de ucfoutu

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.