ListView Control #2

By , 9. September 2006

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.

Gruppierte Darstellungsweise von ListView Einträge

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

Leave a Reply

You must be logged in to post a comment.

OfficeFolders theme by Themocracy