none
Suppression doublon dans une listView RRS feed

  • Question

  • Bonjour,

    Sous VB2010, Je charge des fichiers excels dans une listView. Mais j'ai remarqué que je peux avoir des doublons si je charge 2x les memes fichiers.

    J'ai donc crée un bouton pour supprimé les doublons, sauf qu'il m'affiche une erreur d'argument. Un peu comme s'il allait trop long dans le tableau ou qu'il s'y perdrait...

    Desfois il me supprime les doublons, et des fois il me supprime un fichier qui n'est pas en doublon ....

    Je suis proche de la vérité, mais je suis pas sur que j'utilise la bonne méthode ... Enfin ill me dis a chaque fois qu'il y a un problème quand meme !

    Voila le code derrière le bouton

     Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
    For i = 0 To ListView2.Items.Count - 3
                For j = 1 To ListView2.Items.Count - 2
                    If ListView2.Items(i).Text = ListView2.Items(j).Text Then
                        ListView2.Items(i).Remove()
                    End If
                Next
            Next
        End Sub



    • Modifié Tom57000 jeudi 10 avril 2014 09:49
    jeudi 10 avril 2014 09:47

Réponses

  • J'ai trouvé la solution,

    Je passe par un tableau intermédiaire, je remets mon code qui marche

    'definition nouveau tableau
            Dim list2() As String
            ReDim list2(1)
            Dim nb = 1
            'Premier element du tableau = premier element de la ListView
            list2(1) = ListView2.Items(0).Text
            For i = 1 To ListView2.Items.Count - 1
                'Si  la ligne (i-1) est différente de la ligne (i)
                If ListView2.Items(i - 1).Text <> ListView2.Items(i).Text Then
                    nb = nb + 1
                    'Je la garde
                    ReDim Preserve list2(nb)
                    'je la stocke
                    list2(nb) = ListView2.Items(i).Text
                End If
            Next
            'J'efface les éléments du tableau
            ListView2.Items.Clear()
            'Je mets mon nouveau tableau dans ma listView
            For i = 1 To nb
                ListView2.Items.Add(list2(i))
            Next

    • Marqué comme réponse Tom57000 jeudi 10 avril 2014 13:23
    jeudi 10 avril 2014 13:23

Toutes les réponses

  • Bonjour,

    Essaye ça plutôt :

    Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click For i = 0 To ListView2.Items.Count - 2 For j = i+1 To ListView2.Items.Count - 1 If ListView2.Items(i).Text = ListView2.Items(j).Text Then ListView2.Items(i).Remove() End If Next Next End Sub

    parce que tu parcours 2 fois le même élément du cout il retrouve le même texte et le supprime.

    Essayes de faire un petit exemple de 4 éléments sur papier ça t'aideras à comprendre ce que tu as fait

    jeudi 10 avril 2014 10:03
  • Vous devez comparer chaque item.

    Peut-être vaudrait-il mieux procéder comme ceci :

    Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
        For i = 0 To ListView2.Items.Count - 1
                For j = i+1 To ListView2.Items.Count - 2
                    If ListView2.Items(i).Text = ListView2.Items(j).Text Then
                        ListView2.Items(i).Remove()
                    End If
                Next
            Next
        End Sub


    Nimzozo, from France.

    jeudi 10 avril 2014 10:41
  • Merci de vos reponses, mais j'ai toujours cette erreur d'argument... et apparament il supprimme pas le dernier doublons de la liste ...

    MAJ code :

    Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
            For i = 0 To ListView2.Items.Count - 2
                For j = i + 1 To ListView2.Items.Count - 1
                    If ListView2.Items(i).Text = ListView2.Items(j).Text Then
                        ListView2.Items(i).Remove()
                    End If
                Next
            Next
        End Sub

    jeudi 10 avril 2014 11:32
  • J'ai trouvé la solution,

    Je passe par un tableau intermédiaire, je remets mon code qui marche

    'definition nouveau tableau
            Dim list2() As String
            ReDim list2(1)
            Dim nb = 1
            'Premier element du tableau = premier element de la ListView
            list2(1) = ListView2.Items(0).Text
            For i = 1 To ListView2.Items.Count - 1
                'Si  la ligne (i-1) est différente de la ligne (i)
                If ListView2.Items(i - 1).Text <> ListView2.Items(i).Text Then
                    nb = nb + 1
                    'Je la garde
                    ReDim Preserve list2(nb)
                    'je la stocke
                    list2(nb) = ListView2.Items(i).Text
                End If
            Next
            'J'efface les éléments du tableau
            ListView2.Items.Clear()
            'Je mets mon nouveau tableau dans ma listView
            For i = 1 To nb
                ListView2.Items.Add(list2(i))
            Next

    • Marqué comme réponse Tom57000 jeudi 10 avril 2014 13:23
    jeudi 10 avril 2014 13:23
  • Bonjour

    Ne sera plus simple de faire les vérifications avant ajouter un élément – CAD avant ajouter un élément dans la liste vous vérifiez s’il n’existe pas déjà dans la liste?

    Bien cordialement, 


    Aurel BERA, MSFT
    MSDN Community Support. LE CONTENU EST FOURNI "TEL QUEL" SANS GARANTIE D'AUCUNE SORTE, EXPLICITE OU IMPLICITE.
    S'il vous plaît n'oubliez pas de "Marquer comme réponse" les réponses qui ont résolu votre problème. C'est une voie commune pour reconnaître ceux qui vous ont aidé, et rend plus facile pour les autres visiteurs de trouver plus tard la résolution.

    jeudi 10 avril 2014 13:28
  • Dans ma routine, je fais ça en meme temps que l'ajout des nouveaux Fichiers, donc on ne voit même pas qu'il y aurait pu avoir un doublon.

    Pour moi, le code la me suffit amplement :)

    jeudi 10 avril 2014 13:42
  • Effectivement, j'avais répondu un peu trop vite.

    L'erreur d'argument provient du fait que l'on supprime des items à l'intérieur de la boucle FOR et que cette boucle est dépendante du nombre total d'items...

    Il faut donc utiliser une liste intermédiaire.


    Nimzozo, from France.

    jeudi 10 avril 2014 18:17