Connaitre le nombre de subitems différents dans une listview

Résolu
cs_Fripouil Messages postés 175 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 8 mai 2017 - 21 févr. 2012 à 03:07
cs_Fripouil Messages postés 175 Date d'inscription lundi 16 décembre 2002 Statut Membre 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

28 réponses

ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
29 févr. 2012 à 01:13
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
3
scromania Messages postés 452 Date d'inscription dimanche 20 août 2006 Statut Membre Dernière intervention 11 janvier 2013 9
21 févr. 2012 à 07:53
bonjour,

Tu peux trié ta listview puis ensuite bouclé et comptabilisé.
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
21 févr. 2012 à 08:01
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
0
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
21 févr. 2012 à 08:34
HashTable dans le cas présent, ucfoutu, en .Net

Renfield - Admin CodeS-SourceS - MVP Visual Basic & Spécialiste des RegExp
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
21 févr. 2012 à 08:35
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
0
cs_Fripouil Messages postés 175 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 8 mai 2017
21 févr. 2012 à 11:00
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
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
21 févr. 2012 à 11:10
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
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
21 févr. 2012 à 11:15
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
0
cs_Fripouil Messages postés 175 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 8 mai 2017
21 févr. 2012 à 12:32
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
0
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
21 févr. 2012 à 14:22
à 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
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
21 févr. 2012 à 15:08
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
0
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
21 févr. 2012 à 15:48
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
0
cs_Fripouil Messages postés 175 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 8 mai 2017
21 févr. 2012 à 23:30
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
0
LIBRE_MAX Messages postés 1402 Date d'inscription mardi 1 mai 2007 Statut Membre Dernière intervention 7 octobre 2012 6
22 févr. 2012 à 00:41
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.
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
28 févr. 2012 à 23:27
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
0
LIBRE_MAX Messages postés 1402 Date d'inscription mardi 1 mai 2007 Statut Membre Dernière intervention 7 octobre 2012 6
28 févr. 2012 à 23:57
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.
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
29 févr. 2012 à 00:21
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
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
29 févr. 2012 à 00:26
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
0
LIBRE_MAX Messages postés 1402 Date d'inscription mardi 1 mai 2007 Statut Membre Dernière intervention 7 octobre 2012 6
29 févr. 2012 à 00:30
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.
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
29 févr. 2012 à 00:39
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
0
Rejoignez-nous