Suchergebnis im Listenfeld markieren

Die Kombination aus einem Textfeld, das zur Eingabe eines Suchbegriffs dient, und einem Listenfeld, dass die zum jeweiligen Suchbegriff passenden Treffer anzeigt, haben wir bereits einmal in Access im Unternehmen beschrieben. Wenn das Listenfeld nicht allzu viele Einträge aufweist, gibt es noch eine Alternative: Die gefundenen Einträge sollen dabei einfach markiert werden. Dieser Beitrag zeigt, wie es funktioniert..

Ausgangspunkt ist ein Formular mit einem Textfeld namens txtSuche und einem Listenfeld namens lstSuchergebnis. Das Listenfeld zeigt die Daten einer Tabelle an, beispielsweise tblArtikel.

Davon sollen die ersten beiden Felder berücksichtigt werden, wobei das Feld ArtikelID als gebundene Spalte nicht sichtbar sein soll – allein die Werte des Feldes Artikelname sollen im Listenfeld erscheinen.

Dazu stellen Sie die Datensatzherkunft des Listenfeldes auf die folgende Abfrage ein:

SELECT ArtikelID, Artikelname FROM tblArtikel ORDER BY Artikelname

Dies sortiert die Einträge zusätzlich nach dem Wert des Feldes Artikelname. Damit die erste Spalte mit der ArtikelID ausgeblendet wird, stellen Sie außerdem die beiden Eigenschaften Spaltenanzahl und Spaltenbreite auf die Werte 2 und 0cm ein. Das Listenfeld soll nicht nur einen Eintrag gleichzeitig, sondern alle Ergebnisse markieren. Deshalb müssen Sie die Eigenschaft Mehrfachauswahl auf Einzeln oder Erweitert einstellen, der Wert Keine erlaubt nur die Auswahl eines einzigen Eintrags.

Zu Beginn alle Einträge markieren

Bei einem leeren Suchfeld sollen alle Einträge des Listenfeldes markiert werden. Um dies beim Laden des Formulars zu bewerkstelligen, legen Sie für das Ereignis Beim Laden die Ereignisprozedur aus Listing 1 an. Diese Prozedur durchläuft alle Einträge des Listenfeldes und stellt die Eigenschaft Selected für den jeweils mit dem Index i markierten Eintrag auf den Wert True ein.

Private Sub Form_Load()
     Dim i As Integer
     For i = 0 To Me!lstSuchergebnis.ListCount - 1
         Me!lstSuchergebnis.Selected(i) = True
     Next i
End Sub

Listing 1: Markieren aller Einträge des Listenfeldes

Das Suchfeld

Das Textfeld txtSuche soll bei Eingabe eines beliebigen Zeichens das Ereignis Bei änderung auslösen. Dazu hinterlegen Sie eine entsprechende Ereignisprozedur, die bereits die komplette Funktion dieser Lösung enthält.

Diese sieht im ersten Ansatz wie in Listing 2 aus. Die Prozedur durchläuft alle Einträge des Listenfeldes und vergleicht den mit Column(1,i) ermittelten angezeigten Wert mit dem mit Platzhaltern aufgefüllten Suchbegriff. Wenn der Benutzer den Buchstaben A eingibt, lautet der Vergleichsausdruck also *A*.

Private Sub txtSuche_Change()
     Dim i As Integer
     For i = 0 To Me!lstSuchergebnis.ListCount - 1
         If Me!lstSuchergebnis.Column(1, i) Like "*" & Me!txtSuche.Text & "*" Then
             Me!lstSuchergebnis.Selected(i) = True
         Else
             Me!lstSuchergebnis.Selected(i) = False
         End If
     Next i
End Sub

Listing 2: Markieren der Suchergebnisse

Wenn der Vergleichsausdruck im angezeigten Eintrag gefunden wird, soll der Eintrag entsprechend markiert werden. Dies erledigt das Einstellen der Selected-Eigenschaft für den aktuellen Index auf den Wert True.

Allerdings sollen ja, wie oben angegeben, bereits beim öffnen des Formulars alle Einträge markiert sein. Für die nicht passenden Einträge müsste die Prozedur also noch die Markierung aufheben.

Dies erledigt die Prozedur im Else-Zweig der If…Then-Bedingung, wo sie Selected(i) auf False einstellt.

Erster Test

Der Wechsel in die Formularansicht und die Eingabe des Buchstaben A in das Formular liefert grundsätzlich das gewünschte Resultat (s. Bild 1). Allerdings scrollt Access das Listenfeld soweit nach unten, dass auch der zuletzt markierte Eintrag sichtbar ist. Wie können wir dies so ändern, dass nach wie vor die ersten Einträge angezeigt werden Es wäre einen Versuch wert, die Markierung in umgekehrter Reihenfolge vorzunehmen. Dies erledigen wir ganz einfach, indem wir die For…Next-Schleife entsprechend anpassen:

Nach dem Suchen zeigt das Listenfeld die untersten markierten Einträge an.

Bild 1: Nach dem Suchen zeigt das Listenfeld die untersten markierten Einträge an.

For i = Me!lstSuchergebnis.ListCount - 1 To 0 Step -1

Sie haben das Ende des frei verfügbaren Textes erreicht. Möchten Sie ...

TestzugangOder bist Du bereits Abonnent? Dann logge Dich gleich hier ein. Die Zugangsdaten findest Du entweder in der aktuellen Print-Ausgabe auf Seite U2 oder beim Online-Abo in der E-Mail, die Du als Abonnent regelmäßig erhältst:

Schreibe einen Kommentar