Listview Gruppen auf Vorhandensein prüfen

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 14 Antworten in diesem Thema. Der letzte Beitrag () ist von Axxxxxl.

    Listview Gruppen auf Vorhandensein prüfen

    Hallo,

    ich lade mir durch eine DB-Abfrage per Schleife mehrere Einträge. Einer davon soll als Name der Gruppe dienen, welche ich dazu in einem ListView anlege. Das klappt auch wunderbar.
    Hat nun bspw. der 2. Eintrag den gleichen Wert wie der 1. dann würde eine neue Gruppe im Listview entstehen, was ich natürlich nicht möchte. Aus diesem Grund habe ich noch eine Funktion aus dem Inet eingebaut, die das Vorhandensein der Gruppe prüfen soll. Anbei mein Code dazu. Leider funktioniert das nicht, da er trotzdem auch für gleichlautende Werte jeweils eine neue Gruppe anlegt?!

    Könnt ihr mir da helfen?!

    hier der Auszug aus dem Programm:

    Spoiler anzeigen

    VB.NET-Quellcode

    1. 'für jeden FA eine Gruppe anlegen
    2. Dim gruppenname As String = (reader("fa92"))
    3. Dim gruppe As ListViewGroup = New ListViewGroup(gruppenname, HorizontalAlignment.Left)
    4. 'falls es Gruppe noch nicht gibt diese neu anlegen und dort den Eintrag machen
    5. If EintragVorhanden(gruppenname) = False Then
    6. lv_t92.Groups.Add(gruppe)
    7. Dim Item As ListViewItem = New ListViewItem
    8. Item.Text = (reader("ronr"))
    9. Item.Group = gruppe
    10. lv_t92.Items.Add(Item)
    11. 'falls es die Gruppe schon gibt dann nur den Eintrag in die Gruppe machen
    12. ElseIf EintragVorhanden(gruppenname) = True Then
    13. Dim Item As ListViewItem = New ListViewItem
    14. Item.Text = (reader("ronr"))
    15. Item.Group = gruppe
    16. lv_t92.Items.Add(Item)
    17. End If
    18. 'Spaltenbreite anpassen
    19. lv_t92.Columns(0).Width = 90
    20. End If
    21. Loop
    22. 'Verbindung schließen
    23. lbl_status.Text = "Abfrage erfolgreich beendet"
    24. reader.Close()
    25. con.Close()
    26. 'Anzahl Datensätze ausgeben
    27. Dim anzahl As String = lv_titem.Items.Count
    28. lbl_status.Text = anzahl & " Datensätze gefunden"
    29. Catch ex As Exception
    30. MsgBox(ex.Message)
    31. lbl_status.Text = "Abfrage abgebrochen"
    32. Finally
    33. con.Close()
    34. End Try
    35. End Sub
    36. Function EintragVorhanden(ByVal eintrag As String) As Boolean
    37. Dim i As ListViewGroup
    38. EintragVorhanden = False
    39. For Each i In lv_t92.Groups
    40. MessageBox.Show("Name der aktuellen Vergleichsgruppe ist: " & i.Name)
    41. If i.Name = eintrag Then
    42. EintragVorhanden = True
    43. Exit For
    44. End If
    45. Next
    46. End Function
    ==> seid .net zueinander :D <3 <==
    Kommt denn in deiner Function EintragVorhanden(gruppenname) ein Wert (True/False) zurück? Gibt es einen speziellen Grund, warum deine Function keinen Rückgabewert (z.B. "Return True) hat? Auf die schnelle würde ich hier das Problem vermuten. Hab's aber nicht explizit getestet...
    "Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. Lehre einen Mann zu fischen und du ernährst ihn für sein Leben."

    Wie debugge ich richtig? => Debuggen, Fehler finden und beseitigen
    Wie man VisualStudio nutzt? => VisualStudio richtig nutzen
    Das ist auch meine Vermutung, dass die Prüfung auf vorhandene Gruppen in der Funktion nicht klappt?! Ich weiß halt nicht, ob das mit "lv_t92.Groups" überhaupt der richtige Weg ist um die vorhandenen Gruppen in einem Listview zu prüfen bzw. ob "i.Name" der richtige Befehl ist. Laut Hilfe in VB Studio soll der aber die Namen der Gruppen ausspucken?!

    VB.NET-Quellcode

    1. Function EintragVorhanden(ByVal eintrag As String) As Boolean
    2. Dim i As ListViewGroup
    3. Return False
    4. For Each i In lv_t92.Groups
    5. If i.Name = eintrag Then
    6. Return True
    7. Exit For
    8. Else
    9. Return False
    10. End If
    11. Next
    12. End Function


    Vielleicht hat noch jemand nen Hinweis?!
    ==> seid .net zueinander :D <3 <==
    sorry, aber ein kleines Problem gibt es scheinbar noch:
    - wenn eine Gruppe noch nicht vorhanden ist, wird diese auch angelegt und das item darin gespeichert
    - gehört das nächste item der Abfrage allerdings auch zur gleichen, nun schon vorhandenen Gruppe, wird es trotzdem unter dem Gruppenname "default" hinterlegt
    - ein weiteres item, welches einer neuen Gruppe angehört wander aber wiederum orderntlich in die neu benannten Gruppe

    Summa summarum werden also jeweils nur die Folge-Items einer schon vorhandenen Gruppe nicht dort abgelegt sondern in "default" ?!?!

    Hier nochmal der verantwortliche Code:

    VB.NET-Quellcode

    1. ElseIf modus = "t92" Then
    2. 'jede Druckrolle wird unter den zugehörigen FA gruppiert
    3. Dim gruppenname As String = Mid((reader("fa92")), 6, 5)
    4. Dim gruppe As ListViewGroup = New ListViewGroup(gruppenname, HorizontalAlignment.Left)
    5. Dim Item As ListViewItem = New ListViewItem
    6. 'falls es die Gruppe schon gibt dann nur den Eintrag in die Gruppe machen
    7. If gruppencheck(gruppenname) = True Then
    8. 'MessageBox.Show("Item wird in vorhandene Gruppe " & gruppe.ToString & " angelegt")
    9. Item.Text = (reader("ronr"))
    10. Item.Group = gruppe
    11. lv_t92.Items.Add(Item)
    12. 'falls es Gruppe noch nicht gibt diese neu anlegen und dort den Eintrag machen
    13. ElseIf gruppencheck(gruppenname) = False Then
    14. lv_t92.Groups.Add(gruppe)
    15. Item.Text = (reader("ronr"))
    16. Item.Group = gruppe
    17. 'MessageBox.Show("Gruppe ist: " & gruppe.ToString)
    18. lv_t92.Items.Add(Item)
    19. End If
    20. End If
    21. 'nächsten Eintrag aus DB lesen
    22. Loop
    ==> seid .net zueinander :D <3 <==
    Ich habe es jetzt so:

    VB.NET-Quellcode

    1. 'falls es die Gruppe schon gibt dann nur den Eintrag in die Gruppe machen
    2. If gruppencheck(gruppenname) = True Then
    3. Item.Text = (reader("ronr"))
    4. Item.Group = lv_t92.Groups(gruppenname)
    5. lv_t92.Items.Add(Item)


    Leider fliegen die Folge-Items immer noch in Default !?! :/
    ==> seid .net zueinander :D <3 <==

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Axxxxxl“ ()

    Hat mir nichts brauchbares ausgeworfen.
    Hier noch mal der aktuelle Quelltext. Vielleicht einfach mal bei euch in ein Testprojekt kopieren und teste. Die Variablen für die items können ja irgendwelche sein.
    Danke für die Geduld :rolleyes:

    Spoiler anzeigen

    VB.NET-Quellcode

    1. 'jede Druckrolle wird unter den zugehörigen FA gruppiert
    2. Dim gruppenname As String = Mid((reader("fa92")), 6, 5)
    3. Dim rollennnummer As String = reader("ronr")
    4. Dim gruppe As ListViewGroup = New ListViewGroup(gruppenname, HorizontalAlignment.Left)
    5. Dim item As ListViewItem = New ListViewItem
    6. 'falls es Gruppe noch nicht gibt diese neu anlegen und dort den Eintrag machen
    7. If gruppencheck(gruppenname) = False Then
    8. lv_t92.Groups.Add(gruppe)
    9. MessageBox.Show("Gruppe " & gruppenname & " fehlte! Nun Eintrag machen")
    10. item.Text = rollennnummer
    11. item.Group = gruppe
    12. lv_t92.Items.Add(item)
    13. 'falls es die Gruppe schon gibt dann nur den Eintrag in die Gruppe machen
    14. ElseIf gruppencheck(gruppenname) = True Then
    15. MessageBox.Show("Gruppe " & gruppenname & " existiert, nur Eintrag machen")
    16. item.Text = rollennnummer
    17. item.Group = gruppe
    18. lv_t92.Items.Add(item)
    19. End If
    20. Function gruppencheck(ByVal eintrag As String) As Boolean
    21. Dim i As ListViewGroup
    22. For Each i In lv_t92.Groups
    23. If i.Header = eintrag Then
    24. Return True
    25. Else : Return False
    26. End If
    27. Next
    28. Return False
    29. End Function

    ==> seid .net zueinander :D <3 <==
    Moin allerseits ;)

    Wald und Bäume ?( :S ...
    ich deklariere nun testweise für den Fall, dass es die Gruppe schon gibt eine weitere Variable:

    VB.NET-Quellcode

    1. Dim gruppe_vorhanden As ListViewGroup = lv_t92.Groups(gruppenname)

    und weise die dann dem Item beim Eintragen ins Listview per

    VB.NET-Quellcode

    1. item.Group = gruppe_vorhanden
    zu.
    Ergebnis wie gehabt. Anhand der Messagbox weiß ich zwar, dass er erkennt, dass es die Gruppe XY schon im Control gibt, aber dann gehe ich doch auch davon aus, dass wenn er sie bei der Prüfung "sieht" auch ein item dort reinschreiben kann?! ;(

    Hier die Bilder beim Haltepunkt, einmal bei neuem Item und einmal bei Item einer vorhandenen Gruppe. Meiner Ansicht nach ist doch dort die Gruppen-Variable jedesmal mit dem richtigen Wert gefüllt?!
    Bilder
    • vb_item_folge_item.png

      12,27 kB, 685×222, 70 mal angesehen
    • vb_item_neu.png

      12,76 kB, 700×221, 72 mal angesehen
    ==> seid .net zueinander :D <3 <==

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Axxxxxl“ ()

    So, nachdem ich in ungeahnte Google-Tiefen vorgedrungen bin, hier nun die Lösung die funktioniert (und sogar noch jede Menge Codezeilen gespart hat :) :(

    VB.NET-Quellcode

    1. 'jede Druckrolle wird unter den zugehörigen FA gruppiert
    2. Dim gruppenname As String = Mid((reader("fa92")), 6, 5)
    3. Dim rollennummer As String = (reader("ronr"))
    4. 'falls es Gruppe noch nicht gibt diese neu anlegen
    5. If gruppencheck(gruppenname) = False Then
    6. lv_t92.Groups.Add(New ListViewGroup(gruppenname, gruppenname))
    7. End If
    8. 'Eintrag in der Gruppe machen
    9. lv_t92.Items.Add(New ListViewItem(rollennummer, 0, lv_t92.Groups(gruppenname)))
    10. End If


    Danke an Fakiz für seine Denkanstöße :thumbsup: :thumbup:
    ==> seid .net zueinander :D <3 <==