Home > Artikel > Ausgabe 8/2012 > Zugriff auf Daten im ListView-Steuerelement

Zugriff auf Daten im ListView-Steuerelement

Achtung: Sie sind nicht angemeldet. Wenn Sie Abonnent sind und sich anmelden, lesen Sie den kompletten Artikel, laden das PDF herunter oder probieren die Beispieldatenbank aus (sofern vorhanden).

Genau wie beim Listenfeld oder auch in einem Datenblatt gibt es Möglichkeiten, Einträge anzuklicken, den markierten Eintrag auszuwerten oder auch per Code bestimmte Einträge zu markieren. Wie dies gelingt, zeigt dieser Artikel.

Beispieldatenbank

Die Beispiele dieses Artikels finden Sie in der Datenbank 1208_ListView_Zugriff.mdb.

Eigenschaften zur Markierung

Zunächst schauen wir uns die Eigenschaft FullRowSelect an. Mit dieser legen Sie fest, auf welchen Bereich der Benutzer klicken muss, um einen Eintrag zu markieren und wie der markierte Eintrag hervorgehoben wird.

Im Beispiel im Formular frmListViewMarkieren können Sie diese Eigenschaft mit der Umschaltfläche tglKompletteZeile ein- und ausschalten. Das Formular basiert auf dem Formular frmListViewMitDatenAusTabelle, das Listenfeld wird wie im Artikel ListView-Steuerelement mit Daten füllen mit den Daten der Tabelle tblPersonal gefüllt.

Über dem List­View-Steuerelement haben wir eine Umschaltfläche platziert, welche die Eigenschaft FullRowSelect des ListView-Steuerelements abwechselnd auf die Werte True und False einstellt.

Damit dies geschieht, legen Sie für die Umschaltfläche mit dem Namen tblKompletteZeile eine Ereignisprozedur an, die durch das Ereignis Nach Aktualisierung ausgelöst wird (Markieren der Eigenschaft, Auswahl von [Ereignisprozedur], Klick auf die Schaltfläche mit den drei Punkten). Diese Prozedur füllen Sie wie folgt:

Private Sub tglKompletteZeile_AfterUpdate()

     Select Case Me!tglKompletteZeile

         Case -1

             objLvwPersonal.FullRowSelect = True

         Case 0

             objLvwPersonal.FullRowSelect = False

     End Select

End Sub

Beim Laden des Formulars wird die Eigenschaft FullRowSelect auf den Wert False eingestellt, was die folgende Zeile in der Prozedur Form_Load bewirkt:

Private Sub Form_Load()

     Set objLvwPersonal = Me!lvwPersonal.Object

     With objLvwPersonal

          ...

         .FullRowSelect = False

         ...

End Sub

Dies sorgt außerdem dafür, dass nur ein Klick auf den Text in der ersten Spalte des ListView-Steuerelements den gewünschten Eintrag markiert – und hier auch nur den Inhalt der ersten Spalte (siehe Bild 1).

Einstellen der Spalten im ListView-Steuerelement

Bild 1: Einstellen der Spalten im ListView-Steuerelement

Die übrigen hier nicht abgebildeten Anweisungen finden Sie im Klassenmodul Form_frmListViewMarkieren der Beispieldatenbank, die Erläuterung dazu im Artikel ListView-Steuerelement mit Daten füllen.

Da die Umschaltfläche beim Öffnen des Formulars standardmäßig den Wert Null enthält, ändert ein erster Klick den Wert auf -1, also True. Dies löst die Ereignisprozedur tblKompletteZeile_AfterUpdate aus und stellt die Eigenschaft FullRowSelect ebenfalls auf True ein. Ein weiterer Klick stellt die Eigenschaft wieder auf False ein. Wenn FullRowSelect den Wert True enthält, kann der Benutzer den Eintrag an einer beliebigen Stelle anklicken. Dies markiert dann auch die komplette Zeile (siehe Bild 2).

Markieren der kompletten Zeile im ListView

Bild 2: Markieren der kompletten Zeile im ListView

Den markierten Datensatz ermitteln

Wenn der Benutzer einen Datensatz markiert, dann zum Durchführen einer bestimmten Aktion: Vielleicht möchte er die Detailansicht aufrufen, den Datensatz löschen oder etwas anderes damit erledigen. In jedem Fall benötigen wir dann einen eindeutigen Hinweis auf diesen Datensatz – in der Regel den Wert des Primärschlüsselfeldes für diesen Eintrag.

Diesen haben wir beispielsweise in der ersten Spalte des ListView-Steuerelements abgebildet, aber er befindet sich auch in der Key-Eigenschaft eines jeden Eintrags. Wir schauen uns erst an, wie Sie den Wert der ersten Spalte ermitteln und kümmern uns dann um die Key-Eigenschaft. Letztere wird vermutlich öfter eingesetzt, da es nicht immer gewünscht ist, die Werte der Primärschlüsselfelder anzuzeigen.

Führen wir die ersten Versuche über das Direktfenster aus (Tastenkombination Strg + G) – bei in der Formularansicht geöffnetem Formular frmListViewMarkieren und markiertem Datensatz. Dann referenzieren Sie das ListView-Steuerelement wie folgt – hier zur Ausgabe des Namens zur Prüfung, ob der Bezug stimmt:

  Forms!frmListViewMarkieren!lvwPersonal.Name

    lvwPersonal

Dies gelingt bereits. Übrigens ist es eine gute Idee, sich zum Ermitteln von Bezügen auf Steuerelemente oder Eigenschaften in einem Formular Schritt für Schritt vorzuarbeiten. Auf diese Weise können Sie potenzielle Fehlerquellen nacheinander eliminieren.

Wenn wir uns dann weiter vorarbeiten, verwenden wir die Eigenschaft SelectedItem, um auf den gewünschten Eintrag zuzugreifen. Dies liefert in folgendem Beispiel den Wert 3:

  Forms!frmListViewMarkieren!lvwPersonal.SelectedItem

    3

Nun stellt sich nur noch die Frage: Liefert dies den Wert der ersten Spalte oder den Index der markierten Spalte? Leider sind beide Werte gleich, sodass wir dies aktuell nicht ermitteln können.

Wie finden wir also heraus, ob die Eigenschaft den Index oder den Wert der ersten Spalte liefert? Ganz einfach: Wir fügen die Daten der Datenherkunft so hinzu, dass diese in der umgekehrten Reihenfolge angezeigt werden. Dazu brauchen Sie nur den ersten Parameter der Add-Anweisung in der Prozedur ListViewFuellen im Klassenmodul Form_frmListViewMarkieren auf 1 einstellen:

Set objListitem = objLvwPersonal.ListItems.Add(1, "p" & rst!PersonalID, rst!PersonalID)

Der neueste Eintrag wird dann jeweils an der ersten Position eingefügt, sodass die Datensätze wie in Bild 3 hinzugefügt werden. Eine erneute Abfrage liefert dann Gewissheit, dass SelectedItem den Wert des ersten Feldes zurückgibt. Aber ist das die ganze Wahrheit? Nein. Dies finden Sie heraus, wenn Sie einmal mit SelectedItem den aktuellen Wert abfragen möchten, wenn gar kein Eintrag markiert ist. Dies liefert die Fehlermeldung aus Bild 4.

Datensätze in umgekehrter Reihenfolge

Bild 3: Datensätze in umgekehrter Reihenfolge

Fehler beim Zugriff auf SelectedItem, wenn kein Datensatz markiert ist

Bild 4: Fehler beim Zugriff auf SelectedItem, wenn kein Datensatz markiert ist

Wenn SelectedItem den Typ Variant, String oder einen Zahlendatentyp hätte, würde dies nicht passieren. Zum Glück können wir den Typ des von Selected­Item gelieferten Wertes mit der Funktion TypeName ermitteln – zumindest, wenn ein Eintrag markiert ist:

  Typename(Forms!frmListViewMarkieren! lvwPersonal.SelectedItem)

    IListItem

SelectedItem liefert also ein Objekt zurück, das auf der Schnittstelle IListItem basiert – in diesem Fall mit dem Datentyp ListItem (wäre hier nun kein Eintrag markiert gewesen, hätte Typename den Wert Nothing geliefert, weil SelectedItem schlicht leer ist). Dies nur als theoretischer Hintergrund. Es stellt sich hier die Frage, warum SelectedItem bei einem markierten Element den Wert der ersten Spalte des markierten Elements zurückliefert.

Der Grund ist, dass SelectedItem wie auch andere Objekte wie etwa ein Textfeld eine Standardeigenschaft besitzen, die abgefragt werden, wenn der Entwickler keine Eigenschaft angibt. In diesem Fall handelt es sich um die Text-Eigenschaft, die Sie auch direkt abfragen können – am einfachsten wieder im Direktfenster (Anweisung in einer Zeile):

  Forms!frmListViewMarkieren!lvwPersonal.µ SelectedItem.Text

    3

Primärschlüsselwert aus Key ermitteln

Nun enthält die erste Spalte nicht immer den Primärschlüsselwert, der aber so wichtig ist, um etwas mit dem betroffenen Datensatz anzustellen. Wie können wir noch auf den Primärschlüsselwert zugreifen? Es hat sich als gängige Praxis herausgestellt, den Primärschlüsselwert mit einem führenden Buchstaben (oder auch mehreren) zu versehen und diesen für die Eigenschaft Key anzugeben.

Auf diese Weise schlagen Sie zwei Fliegen mit einer Klappe: Erstens ist jedes Element im ListView-Steuerelement eindeutig identifizierbar und zweitens können Sie darüber den Primärschlüsselwert ermitteln.

In diesem Beispiel erhält die Key-Eigenschaft jeweils den Buchstaben p und den Primärschlüsselwert des abgebildeten Datensatzes zugewiesen, also beispielsweise p3. Dies geschieht gleich beim Hinzufügen der Elemente:

Set objListitem = objLvwPersonal.ListItems.Add(1, "p" & rst!PersonalID, rst!PersonalID)

Den Key-Wert des aktuell markierten Datensatz können Sie nun mit folgender Zeile ausgeben:

  Forms!frmListViewMarkieren!lvwPersonal. SelectedItem.Key

    p3

Nun benötigen wir aber nur den Primärschlüsselwert. Außerdem soll gleich noch geprüft werden, ob überhaupt ein Eintrag markiert wurde, da sonst ein Fehler ausgelöst wird. Dies erledigen wir mit einer Schaltfläche namens cmdMarkierterDatensatz. Für die Beim Klicken-Ereigniseigenschaft hinterlegen wir die folgende Ereignisprozedur:

Private Sub cmdMarkierterDatensatz_Click()

     If Me!lvwPersonal.SelectedItem Is Nothing Then

         MsgBox "Kein Eintrag markiert."

     Else

         MsgBox "Datensatz " & Mid(Me!lvwPersonal.SelectedItem.Key, 2) & " ist markiert."

Sie haben das Ende des frei verfügbaren Teil dieses Artikels erreicht!

Wenn Sie mehr lesen und auf viele weitere Artikel zugreifen möchten, melden Sie sich als Abonnent unter Login an. Falls nicht, bestellen Sie doch einfach ein Jahresabonnement!