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

LIBRE_MAX Messages postés 1402 Date d'inscription mardi 1 mai 2007 Statut Membre Dernière intervention 7 octobre 2012 5
29 févr. 2012 à 00:42
[i]"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
''/i

Moi, c'est ce que je souligne ici, qui pose problème :
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 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 236
29 févr. 2012 à 00:56
Je t'ai déjà dit que j'avais vu et constaté que tu avais raison.

Mais je viens d'essayer avec un dico et une listbox comportant 30000 articles, pour voir.
Le résultat est atteint sans faille à la vitesse de l'éclair (moins de 1/10ème de seconde)
Je n'ai pas VB.Net, mais voilà le code VB6
Set mondico = CreateObject("Scripting.Dictionary")
  deb = Timer
   For i = 0 To List1.ListCount - 1
     If Not mondico.exists(List1.List(i)) Then mondico.Add List1.List(i), ""
   Next
  MsgBox mondico.Count


Pour être certain d'avoir des doublons de manière aléatoire, j'ai ainsi rempli la listbox :
Randomize
For i = 1 To 30025
List1.AddItem Int((1000 * Rnd) + 1)
Next
____________________
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 5
29 févr. 2012 à 01:16
>ucfoutu:
J' ai revisité ton code.
J' ai cru un moment avoir compris ta logique
et j' étais prêt à te donner raison.
Sauf que..

Pour I = 0 jusqu'au dernier
Si I au dernier,J ne peut être au dernier+1
et par conséquent article dernier+1 n' éxiste pas.

D' autre part:
i=dernier
j=dernier
On comparera alors le dernier avec lui même.

Si on corrige par :
Pour I = 0 jusqu'au dernier-1
compteur = compteur + 1
pour J = I + 1 jusqu'au dernier

La dernière comparaison sera entre l' avant dernier et le dernier.
Que fera t' on alors du dernier ?




[] Ce qui va sans dire. va mieux en le disant.
0
LIBRE_MAX Messages postés 1402 Date d'inscription mardi 1 mai 2007 Statut Membre Dernière intervention 7 octobre 2012 5
29 févr. 2012 à 01:17
désolé !
posts croisés..


[] Ce qui va sans dire. va mieux en le disant.
0

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

Posez votre question
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 236
29 févr. 2012 à 07:19
lorsque I = dernier, J = dernier + 1
Or, on n'entre dans une boucle For K = X to Y sans step négatif que su Y >= X
Ce n'est pas cela, qui m'a fait revenir en arrière, mais ta toute première remarque, fondée, par contre.
Mais on va noyer les réponses, si on s'égare.

____________________
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_ShayW Messages postés 3258 Date d'inscription jeudi 26 novembre 2009 Statut Membre Dernière intervention 3 décembre 2019 56
29 févr. 2012 à 13:15
Salut
avec linq

 Private Function CountDistinctItem(ByVal listitem As List(Of String)) As Integer

        Dim sql = (From value As String In listitem Select value Distinct).Count
        Return sql
    End Function
0
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 71
1 mars 2012 à 07:59
LINQ, oui, je l'avais conseillé...

j'avais aussi indiqué :

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

les requetes, extractions etc

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


et sur ce point, pas de réponse de Fripouil...
d'ou proviennent les données affichées dans la listview ?


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
1 mars 2012 à 15:47
Bonjour,

Merci à tous pour votre aide.

Pour répondre à Renfield, les données proviennent de fichiers csv.

Je remplis mes listviews de cette façon :
Try
            ' AFFICHAGE DE LA BOITE DE DIALOGUE
            Ouvrir_Fichier_Fournisseur.ShowDialog()

            ' INDIQUE L'EMPLACEMENT DU FICHIER FOURNISSEUR DANS LE LABEL : LBL_EMPLACEMENT_FICHIER_FOURNISSEUR
            Lbl_Emplacement_Fichier_Fournisseur.Text = Ouvrir_Fichier_Fournisseur.FileName

            ' SI LE LABEL ( LBL_EMPLACEMENT_FICHIER_FOURNISSEUR ) EST RENSEIGNE
            If Lbl_Emplacement_Fichier_Fournisseur.Text <> "" Then

                ' ON VIDE LA LISTVIEW : LISTE_ARTICLES_FOURNISSEUR
                Liste_Articles_Fournisseur.Items.Clear()

                ' ON CHARGE LES DONNEES DANS LA LISTVIEW : LISTE_ARTICLES_FOURNISSEUR
                SR = New StreamReader(Lbl_Emplacement_Fichier_Fournisseur.Text, System.Text.Encoding.Default)
                Ligne = ""
                Ligne = SR.ReadLine()
                While Not Ligne Is Nothing
                    LVF = New ListViewItem
                    TAB = Ligne.Split(";")
                    LVF.Text = UCase(TAB(0).ToString.Replace(Chr(34), ""))
                    LVF.SubItems.Add(1).Text = UCase(TAB(1).ToString.Replace(Chr(34), ""))
                    LVF.SubItems.Add(2).Text = TAB(2).ToString.Replace(Chr(34), "")
                    LVF.SubItems.Add(3).Text = TAB(3).ToString.Replace(Chr(34), "")
                    LVF.SubItems.Add(4).Text = TAB(4).ToString.Replace(Chr(34), "")
                    Liste_Articles_Fournisseur.Items.Add(LVF)
                    TAB = Nothing
                    Ligne = SR.ReadLine()
                End While
                SR.Close()


Ce fameux Fichier_Fournisseur.csv contient plus de 7760 Lignes ( Articles ) sur 5 colonnes.

A l'aide des réponses fournies suite à mes questions, j' utilise ce code pour le "Comptage" :
 ' COMPTE LE NOMBRE DE REFERENCES DIFFERENTES DANS LA LISTVIEW : FOURNISSEUR
        Dim toto As New Collection
        For i = 1 To Liste_Articles_Fournisseur.Items.Count - 1
            On Error Resume Next
            toto.Add("", Liste_Articles_Fournisseur.Items(i).SubItems(0).Text)
        Next
        Lbl_Nombre_References_Fournisseur.Text = toto.Count


Cela a l'air de fonctionner ( même si je n'ai pas vraiment compter manuellement pour vérifier ) car il me donne 3111 Références sur 7760 Articles.
Le premiére ligne de ma listview est les entêtes des Articles exemple : Référence Maitre / Déclinaison / Stock / etc donc celle ci n' a pas besoin d' être comparer.

Je ne sais pas si mon code est propre et/ou peut être optimiser mais pour l'instant cela fonctionne sans trop ramer ( 4/5 secondes pour le remplissage de mes listviews et 2 secondes pour la comptage.

En tous les cas merci vraiment à tous pour votre intérêt à mon probléme.
Fripouil
0