Listview doppelte items löschen

  • VB.NET

Es gibt 2 Antworten in diesem Thema. Der letzte Beitrag () ist von %P%.

    Listview doppelte items löschen

    Hi,

    ich möchte wie im Titel schon beschrieben, eine listview auf doppelte Einträge untersuchen und die Doppelten löschen. Dies funktioniert auch fast, aber leider nur fast. Ich habe auch keine Ahnung, was falsch ist. Andere Codes (auch in diesem Forum) brachten leider den gleichen Fehler hervor.

    Hier erstmal mein geschriebener Code.

    Quellcode

    1. Dim i1 As Integer = 0
    2. Dim i2 As Integer = i1 + 1
    3. If Me.ListView1.Items.Count > i1 Then
    4. For i As Integer = 0 To Me.ListView1.Items.Count
    5. While Me.ListView1.Items(i1).SubItems(1).Text = Me.ListView1.Items(i2).SubItems(1).Text
    6. While Me.ListView1.Items(i1).SubItems(2).Text = Me.ListView1.Items(i2).SubItems(2).Text
    7. Me.ListView1.Items.RemoveAt(i2)
    8. End While
    9. End While
    10. i1 += 1
    11. i2 += 1
    12. Next
    13. End If


    Listview ist wie folgt gefüllt:

    1---AAA---BBB
    2---AAA---BBB
    3---AAA---BBB
    4---CCC---DDD
    5---CCC---DDD

    Die Zeilen mit den fortlaufenden Nummern 2 und 3 werden löscht, Zeile 1 bleibt stehen.

    Das Problem ist nun, dass jetzt ein Fehler auftritt. Die Quelle ist die Bedingung der 2. While-Schleife: "InvalidArgument=Value mit dem Wert 2 ist für index ungültig. Parametername: index"

    Zu diesem Zeitpunkt sieht Listview so aus:
    1---AAA---BBB
    4---CCC---DDD
    5---CCC---DDD

    In der 2. While-Schleife

    Quellcode

    1. While Me.ListView1.Items(i1).SubItems(2).Text = Me.ListView1.Items(i2).SubItems(2).Text

    ist i1 jetzt 1 und i2 jetzt 2, das heißt für mich, dass das Programm jetzt die Subitems(2) der beiden letzten Zeilen überprüft, dass soll es ja auch.
    Aber wo ist da jetzt der Fehler? Ich komm da einfach nicht weiter. Wie gesagt, auch andere Codes geben das gleichen Fehler aus.

    Ich habe es auch mit .Compare versucht, das bringt aber den gleichen Fehler.

    Irgendwo muss ein Fehler liegen, den ich nicht erkenne...

    Danke für eure Hilfe.
    Die Lösung ist simpel: Durch Löschen von Items rutschen die hinteren "nach".
    Somit wird der Item Count kleiner.

    2 Ansätze:

    1. Do Loopst von hinten durch die ItemCollection, dann hast du keine Problem beim Löschen.
    2. Du setzt den Counter beim Löschvorgang 1 zurück.

    Was das allerdings soll:

    For i As Integer = 0 To Me.ListView1.Items.Count

    i verwendest du nie im Code und Count ist auch immer eins höher als der maximale Index.
    Beim drüber schauen beginne ich zu zweifeln ob DU den Code geschrieben hast. Denn er ergibt so keinen Sinn :)

    Gruss Mono
    Das ist meine Signatur und sie wird wunderbar sein!
    Ganz kleiner Tipp, prüfe doch gleich immer bevor ein neues Item reinkommt ob schon eins dieses Namens vorhanden ist:

    VB.NET-Quellcode

    1. If Not ListView1.Contains("DasNeueItem") Then
    2. ListView1.Items.Add(DasNeueItem)
    3. Else
    4. MsgBox("Ist bereits in der ListView vorhanden!")
    5. End If


    Ist hier grade nicht mein PC, VB is nicht drauf, daher weiß Ich nicht genau ob man Items in einer ListView genau so addet. Aber das Prinzip ist wohl klar

    %P% :thumbup:
    Hello World