ListView Control #2
Um sehr viele Einträge in einem ListView Control sinnvoll darzustellen ist es nützlich diese nach bestimmten Kriterien zu Gruppieren. Das ListView bietet von Haus aus diese Möglichkeit leider nicht, aber man kann per Code da nachhelfen.
Man braucht neben dem ListView eine ImageList die die Icons für plus und minus beinhalten. In einer separaten Tabelle tbl_gruppierung mit Feldnamen gruppe wird festgehalten ob und nach welchem Feld gruppiert wird.
Wenn eine Gruppierung vorliegt wird in die 1. Spalte das plus-Icon geladen, und in die zweite Spalte die Werte die sich aus der Gruppierung ergeben, hier sind dies die versch. Dokumenttypen nach denen gruppiert wurde.
Bei klick auf einen Eintrag wird öber Hittest(x,y) festgestellt welcher ListItem betroffen ist. Dann wird in einer inneren Schleife die zugehörigen Detail-Werte geschrieben. Der in der Abfrage benötigte ID wird bereits beim Aufbau des ListViews in eine Spalte geschrieben dessen Breite 0 ist so dass man direkt über den ID die gruppierten Daten auslesen kann.
Damit man nun aber nach Belieben die Gruppen auf und zuklappen kann und auch z.B. alle aufklappen kann wird in ein Array (collapsedItems) der ID der Gruppe geschrieben welche ausgeklappt angezeigt werden soll. Tabelleneinträge die aus der Gruppierung herausfallen würden, werden in einer separaten Abfrage erfasst und an das Ende des ListViews angefügt unter dem Namen Ungruppiert.
Nachfolgender Code zeigt auszugsweise die Vorgehensweise der gruppierten Darstellung. Tatsächlich bedarf es eines Vielfachen an Code zur Steuerung des Ein- und Ausklappens der Gruppen.
Set rs = CurrentDb.OpenRecordset("Select gruppe from tbl_gruppierung Where selected = -1", dbOpenDynaset) vgroup = LCase(rs!Gruppe) sql = "Select " & vgroup & " As gruppe From tbl_dokument Where " & vgroup & " <> '' Group By " & vgroup Set rs = CurrentDb.OpenRecordset(sql, dbOpenDynaset) Do Until rs.EOF With lstItem For k = LBound(collapsedItems) To UBound(collapsedItems) collapsed = IIf(collapsedItems(k) = rs!Gruppe, True, False) If collapsed Then Exit For Next k .SmallIcon = IIf(collapsed, "minus", "plus") SubItems(2) = Nz(Gruppentitel, "") End With If collapsed Then sql = "Select * from tbl_dokument Where Feldname = '" & vgroup & "'" Set rsi = CurrentDb.OpenRecordset(sql, dbOpenDynaset) Do Until rsi.EOF ' Verarbeitung der inneren Schleife ..... Loop End If rs.MoveNext Loop