Listen anzeigen mit dem ListView-Steuerelement

Die Datenblatt-Ansicht und das Listenfeld sind die bevorzugten Bordmitteln, um Daten in Access in Listenform anzuzeigen. Beide haben Vor- und Nachteile. Doch es gibt auch noch das ListView-Steuerelement, das als ActiveX-Control kommt und mit dem sich viele unterschiedlichen Ansichten realisieren lassen. In diesem Beitrag schauen wir uns an, wie wir Listen mit dem ListView-Steuerelement abbilden können – inklusive Funktionen wie Kontrollkästchen, Icons, Umbenennen und vielen mehr.

Listen werden in Access-Anwendungen immer wieder benötigt. Wenn die Daten bearbeitet werden sollen und Spalten angeordnet, vergrößert und verkleinert oder ein- und ausgeblendet werden sollen, ist die Datenblattansicht die beste Wahl.

Wenn Daten nur zur Auswahl angeboten werden sollen, bietet sich das Listenfeld an. Im Gegensatz zur Datenblattansicht offeriert dieses Steuerelement auch noch die Möglichkeit verschiedener Mehrfachauswahlmodi. Beide haben den großen Vorteil, dass man Datenquellen wie Tabellen oder Abfragen direkt binden kann und dazu kein zusätzlicher Code erforderlich ist.

Eine weitere Möglichkeit zur Darstellung von Listen ist das in diesem Beitrag vorgestellte ListView-Steuerelement. Der Nachteil gleich zu Beginn: Um es mit Daten zu füllen, benötigen wir zwangsläufig VBA-Code.

Es kann nicht einfach an eine Tabelle oder Abfrage gebunden werden, sondern wir müssen die einzelnen Einträge programmgesteuert hinzufügen.

Vorteile sind unter anderem die verschiedenen Ansichten, mit denen wir sowohl Daten in tabellarischer Form oder auch Bilder in Matrix-Form darstellen können. Außerdem können wir ein Kontrollkästchen zum einfachen Markieren von Einträgen anzeigen lassen. Und wir können einfachen Listeneinträgen sogar Icons hinzufügen. Nachfolgend schauen wir uns die verschiedenen Techniken zum Anzeigen von Daten in ListView-Steuerelementen an und gehen auch darauf ein, wie wir mit den enthaltenen Einträgen arbeiten können – beispielsweise, um per Doppelklick ein Detailformular zur Bearbeitung anzuzeigen.

Das Bearbeiten ist nämlich beim ListView-Steuerelement nur für die erste Spalte möglich.

Anlegen eines ListView-Steuerelements

Um einem Formular ein ListView-Steuerelement hinzuzufügen, öffnen wir das Formular in der Entwurfsansicht und wählen im Ribbon den Befehl Formularentwurf|Steuerelemente|ActiveX-Steuerelemente aus (siehe Bild 1).

Auswahl der ActiveX-Steuerelemente

Bild 1: Auswahl der ActiveX-Steuerelemente

Dies blendet den Dialog ActiveX-Steuerelement einfügen ein, in dem wir den Eintrag Microsoft ListView Control, version 6.0 finden (siehe Bild 2). Nach der Auswahl klicken wir auf OK, um das Steuerelement zum Formularentwurf hinzuzufügen.

Auswahl des ListView-Steuerelements

Bild 2: Auswahl des ListView-Steuerelements

Das neue ListView-Steuerelement erscheint erst einmal recht unauffällig (siehe Bild 3), weshalb wir erst einmal seine Größe anpassen.

ListView-Steuerelement im Formularentwurf

Bild 3: ListView-Steuerelement im Formularentwurf

Danach stellen wir seinen Namen ein. Wenn nur ein ListView-Steuerelement vorhanden ist, nennen wir es üblicherweise ctlListView. Natürlich kann man auch den üblichen Benennungskonventionen folgen und einen Namen wie lvwKunden oder lvwProdukte wählen.

Zu Beispielzwecken belassen wir es hier bei ctlListView.

Grundeinstellungen vornehmen

Das ListView-Steuerelement bietet verschiedene Einstellungen für das Erscheinungsbild an. Diese können wir in den Eigenschaften des ListView-Steuerelements anpassen oder wir legen diese per VBA fest.

Im Eigenschaftenblatt finden wir die ListView-spezifischen Einstellungen auf der Registerseite Andere (siehe Bild 4). Diese schauen wir uns in den folgenden Abschnitten im Detail an.

Eigenschaften des ListView-Steuerelements

Bild 4: Eigenschaften des ListView-Steuerelements

Eigenschaften des ListView-Steuerelements

Die nachfolgend vorgestellten Eigenschaften können wir über das Eigenschaftenblatt umstellen oder per VBA. Praktischerweise werden die Eigenschaften des ListView-Steuerelements hier in englischer Sprache abgebildet, sodass wir nicht lange nach den VBA-Pendants suchen müssen.

Eigener Eigenschaftendialog

Noch praktischer ist allerdings, dass das ListView-Steuerelement einen eigenen Eigenschaften-Dialog anbietet, den wir mit dem Kontextmenü-Eintrag ListViewCtrl-Objekt|Properties öffnen (siehe Bild 5).

Anzeigen der Eigenschaften im eigenen Dialog

Bild 5: Anzeigen der Eigenschaften im eigenen Dialog

Dieser zeigt die Eigenschaften wie in Bild 6 an. Im Gegensatz zum herkömmlichen Eigenschaftenblatt sehen wir hier auch gleich die Bezeichnungen der Eigenschaftswerte und nicht nur die entsprechenden Zahlenwerte.

Eigener Eigenschaftendialog

Bild 6: Eigener Eigenschaftendialog

Im Reiter General sehen wir zunächst einige Auswahlfelder für die folgenden Eigenschaften:

  • AllowColumnReorder: Gibt an, ob der Benutzer die Anordnung in der Ansicht lvwReport selbstständig anpassen kann (True/False).
  • Arrange: Erwartet einen der Werte lvwNone, lvwAutoLeft oder lvwAutoTop. Die Werte geben an, in welcher Orientierung Icons in den Ansichten lvwIcon und lvwSmallIcon hinzugefügt werden. lvwAutoLeft füllt erst die erste Spalte und dann die folgenden Spalten, lvwAutoTop füllt erst die erste Zeile und dann die folgenden Zeilen.
  • Appearance: Legt fest, ob das Steuerelement dreidimensional angezeigt wird (cc3d) oder flach (ccFlat).
  • BorderStyle: Legt den Stil des Rahmens fest. Kann die Werte ccFixedSingle oder ccNone annehmen.
  • Checkboxes: Gibt an, ob Kontrollkästchen zur Auswahl von Einträgen angezeigt werden sollen (True/False).
  • Enabled: Gibt an, ob das Steuerelement aktiviert oder deaktiviert ist (True/False).
  • FlatScrollbar: Legt fest, ob die Bildlaufleisten in der 2D- oder 3D-Ansicht angezeigt werden sollen (True/False).
  • FullRowSelect: Gibt an, ob markierte Zeilen vollständig markiert werden sollen oder nur die erste Spalte (True/False).
  • Gridlines: Gibt an, ob in der Ansicht lvwReport Gitternetzlinien zwischen Zeilen und Spalten angezeigt werden sollen.
  • HideColumnHeaders: Gibt an, ob Spaltenüberschriften ein- oder ausgeblendet werden sollen (True/False).
  • HideSelection: Gibt an, ob die Auswahl markiert bleibt, wenn das Steuerelement den Fokus verliert (True/False).
  • HotTracking: Legt fest, ob der Eintrag, der gerade mit der Maus überfahren wird, optisch hervorgehoben werden soll (True/False).
  • HoverSelection: Legt fest, ob Einträge, über denen die Maus kurze Zeit verweilt, automatisch markiert werden sollen (True/False).
  • LabelEdit: Gibt an, ob die Beschriftung der ersten Spalte in der Ansicht lvwReport beziehungsweise die einzige Beschriftung der übrigen Ansichten geändert werden darf. lvwAutomatic erlaubt das Bearbeiten nach dem Anklicken des aktiven Elements, lvwManual erlaubt nur das codegesteuerte Ändern.
  • LabelWrap: Gibt an, ob längere Texte in der Ansicht lvwIcon umbrochen werden sollen.
  • MousePointer: Stellt verschiedene Mauszeiger ein.
  • MultiSelect: Gibt an, ob bei gedrückter Umschalt- oder Strg-Taste mehrere Einträge gleichzeitig markiert werden können (True/False).
  • OLEDragMode: Gibt an, wie das Steuerelement Drag-and-Drop-Operationen initialisiert, wenn der Benutzer ein Objekt zieht. Bei ccOLEDragManual wird Drag and Drop manuell per Code gestartet (zum Beispiel durch Aufruf von OLEStartDrag). Bei ccOLEDragAutomatic wird Drag and Drop automatisch gestartet, sobald der Benutzer ein Element zieht.
  • OLEDropMode: Legt fest, wie das Steuerelement auf ein beim Drag and Drop fallengelassenes OLE-Objekt reagiert. Der Wert ccOLEDropNone erlaubt keine OLE-Drop-Operation. Bei ccOLEDropManual werden Drag and Drop-Ereignisse manuell im Code behandelt (in den Ereignissen OLEDragOver und OLEDragDrop). Bei ccOLEDropAutomatic wird der Inhalt automatisch an das Steuerelement übergeben.
  • View: Stellt die Ansicht ein. Die verfügbaren Werte sind lvwIcon, lvwSmallIcon, lvwList und lvwReport. Wenn wir Daten mit mehrern Spalten in Listenform anzeigen wollen, nutzen wir hier den Eintrag lvwReport. Für einspaltige ListViews stellen wir lvwList ein. Wenn wir Icons oder Bilder anzeigen wollen, nutzen wir lvwIcon oder lvwSmallIcons.

Eigenschaften per Eigenschaftenblatt oder VBA festlegen?

Die Mehrzahl der Entwickler stellt die Eigenschaften von Formularen und Steuerelementen über das Eigenschaftenblatt ein. Beim ListView-Steuerelement ist das jedoch etwas unkomfortable, da man hier immer wieder den Eigenschaften-Dialog über das Kontextmenü öffnen muss, statt direkt darauf zuzugreifen wie bei den eingebauten Steuerelementen.

Außerdem haben wir festgestellt, dass wir immer wieder ein festes Set von Eigenschaftswerten für den Einsatz von ListView-Steuerelementen nutzen.

Außerdem muss man ohnehin eine Prozedur schreiben, die beispielsweise beim Laden des Formulars das ListView-Steuerelement mit Daten füllt. Dann kann man auch gleich die Eigenschaften einstellen. Deshalb erledigen wir dies in diesem Beitrag ebenfalls per VBA.

Me.ctlListView oder objListView?

Bei eingebauten Access-Steuerelementen greifen wir in VBA am einfachsten über den Verweis auf das Klassenmodul und den Steuerelementnamen auf das jeweilige Steuerelement zu, zum Beispiel mit Me.txtBeispiel. Das gelingt auch mit dem ListView-Steuerelement. Allerdings erhalten wir dann nur die Standardeigenschaften von Steuerelementen und können nicht per IntelliSense auf die spezifischen Eigenschaften des ListView-Steuerelements zugreifen. Um das zu ermöglichen, benötigen wir eine Objektvariable, die wir beispielsweise wie folgt deklarieren:

Dim objListView As MSComctlLib.ListView

Danach weisen wir dieser nicht etwa Me.ctlListView als Wert zu, sondern Me.ctlListView.Object:

Set objListView = Me.ctlListView.Object

Damit können wir nun Intellisense für die Variable objListView nutzen (siehe Bild 7).

Eigenschaften des ListView-Steuerelements per IntelliSense

Bild 7: Eigenschaften des ListView-Steuerelements per IntelliSense

Einspaltiges ListView-Steuerelement mit Daten füllen

Die einfachste Aufgabe ist es, ein ListView-Steuerelement mit einer einzigen Zeile mit Daten zu füllen. Dazu nutzen wir das Listenfeld aus dem Formular frmListView_Einspaltig.

Mit der folgenden Prozedur nehmen wir zunächst einige Standardeinstellungen vor, durch die das Steuerelement optisch ansprechend dargestellt wird (BorderStyle und Appearance). Außerdem legen wir die View auf lvwList fest für die einspaltige Listenansicht.

Danach füllen wir das ListView-Steuerelement mit drei Einträgen. Dazu nutzen wir die Methode Add der ListItems-Auflistung:

Private Sub Form_Load()
     Dim objListView As MSComctlLib.ListView
     Set objListView = Me.ctlListView.Object
     
     With objListView
         .View = lvwList
         .BorderStyle = ccNone
         .Appearance = ccFlat
         
         .ListItems.Add , "a1", "Text 1"
         .ListItems.Add , "a2", "Text 2"
         .ListItems.Add , "a3", "Text 3"
     End With
End Sub

Die Add-Methode erwartet die folgenden Parameter:

  • Index: Gibt die Position an, an der das Element eingefügt werden soll. Wenn die Elemente in der gewünschten Reihenfolge hinzugefügt werden, kann Index leer bleiben. Ansonsten führt beispielsweise die Verwendung des Wertes 1 dieses 1-basierten Indexes dazu, dass das neue Element an erster Stelle vor eventuell bereits enthaltenen Elementen eingefügt wird.
  • Key: Muss einen eindeutigen Identifizierer enthalten. Dieser muss mit einem Buchstaben beginnen. Wenn man Daten aus Tabellen einfügt, bietet sich die Kombination aus einem Buchstaben und dem Primärschlüsselwert des jeweiligen Eintrags an.
  • Text: Erwartet den für dieses Element anzuzeigenden Text.
  • Icon: Hier können wir, wenn wir ein ImageList-Steuerelement mit Icons zum Formular hinzugefügt haben, den Key oder den Index des für diesen Eintrag anzuzeigenden Icons angeben. Diesen Parameter können wir in der Ansicht lvwIcon nutzen. Auf Icons gehen wir weiter unten ein.
  • SmalIcon: Damit können wir ebenfalls ein Icon zu einem Eintrag hinzufügen. Dieser Parameter ist für die Ansichten lvwSmallIcon, lvwList und lvwDetail zu verwenden.

Geben wir also nun nur Werte für die Parameter Key und Text an, erhalten wir die Ansicht aus Bild 8. Damit sich das ListView-Steuerelement vom Hintergrund abhebt, haben wir die Eigenschaft Rahmenart auf Durchgezogen eingestellt.

ListView-Steuerelement mit einspaltiger Ansicht

Bild 8: ListView-Steuerelement mit einspaltiger Ansicht

Mehrspaltiges ListView-Steuerelement mit Daten füllen

Mehrspaltige ListView-Steuerelemente sind ein wenig aufwendiger zu befüllen. Wir schauen uns dies im Formular frmListView_Mehrspaltig an.

Hier haben wir ebenfalls ein ListView-Steuerelement namens ctlListView hinzugefügt.

Wir führen ebenfalls beim Laden des Formulars eine Ereignisprozedur aus (siehe Listing 1). Diese deklariert neben dem ListView-Objekt noch ein Objekt mit dem Typ ListItem.

Private Sub Form_Load()
     Dim objListView As MSComctlLib.ListView
     Dim objListItem As MSComctlLib.ListItem
     Set objListView = Me.ctlListView.Object
     
     With objListView
         .View = lvwReport
         .LabelEdit = lvwManual
         .BorderStyle = ccNone
         .Appearance = ccFlat
         
         .ColumnHeaders.Add , "c1", "Spalte 1"
         .ColumnHeaders.Add , "c2", "Spalte 2"
         .ColumnHeaders.Add , "c3", "Spalte 3"
         
         Set objListItem = .ListItems.Add(, "a11", "Text 1 Spalte 1")
         objListItem.ListSubItems.Add , "a12", "Text 1 Spalte 2"
         objListItem.ListSubItems.Add , "a13", "Text 1 Spalte 3"
         Set objListItem = .ListItems.Add(, "a21", "Text 2 Spalte 1")
         objListItem.ListSubItems.Add , "ab22", "Text 2 Spalte 2"
         objListItem.ListSubItems.Add , "ab23", "Text 2 Spalte 3"
         Set objListItem = .ListItems.Add(, "a31", "Text 3 Spalte 1")
         objListItem.ListSubItems.Add , "ab32", "Text 3 Spalte 2"
         objListItem.ListSubItems.Add , "ab33", "Text 3 Spalte 3"
     End With
End Sub

Listing 1: Füllen eines ListView-Steuerelements mit mehreren Spalten

Das ist nötig, weil wir zum Anzeigen weiterer Spalten neben der ersten Spalte nicht einfach die Add-Methode des ListView-Objekts nutzen können. Stattdessen nutzen wir das Objekt, das wir mit dieser Add-Methode erstellen und das wir mit der Variablen objListItem referenzieren. Dieses bietet seinerseits eine Auflistung namens ListSubItems mit einer Add-Methode an, die allerdings etwas andere Parameter bietet. Die beiden Parameter Icon und SmallIcon fallen weg, dafür gibt es den Parameter ReportIcon. Dieser ist aber funktional mit dem Parameter SmallIcon identisch.

Damit in der Ansicht lvwDetail überhaupt Einträge angezeigt werden, müssen wir die Spalten definieren. Das erledigen wir mit der Add-Methode der Auflistung Columnheaders des ListView-Objekts.

Ende des frei verfügbaren Teil. Wenn Du mehr lesen möchtest, hole Dir ...

den kompletten Artikel im PDF-Format mit Beispieldatenbank

diesen und alle anderen Artikel mit dem Jahresabo

Schreibe einen Kommentar