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

Die Schleife beginnt nun mit dem letzten Eintrag und arbeitet sich dann nach oben. Dafür sorgt das Schlüsselwort Step mit dem Wert -1.

Flackern verhindern

Allerdings flackert das Formular stark, während die Markierungen vorgenommen werden. Der Grund ist, dass Access kurz den Fokus auf alle Einträge setzt, die markiert werden. Ausgehend davon, dass beim Eingeben des Suchbegriffs der oberste Eintrag angezeigt wird, scrollt Access also zuerst nach ganz unten, um von unten ausgehend die Selected-Einstellung für die Einträge einzustellen und sich dann nach oben zu arbeiten.

Um dies zu verhindern, müssen wir nur die Eigenschaft Painting vor dem Markieren auf False einstellen und nachher wieder auf den Wert True. Dies sieht dann in der Prozedur wie folgt aus:

Private Sub txtSuche_Change()
     Me.Painting = False
     ...
     Me.Painting = True
End Sub

Vorherige Position wiederherstellen

Wenn der Benutzer aber nun vor dem Eingeben des Suchbegriffs bereits die Einträge des Listenfeldes nach unten gescrollt hat, soll das Listenfeld nach dem Markieren möglichst die zuvor sichtbaren Datensätze anzeigen. Dies soll auch für alle anderen Scrollpositionen gelten – egal, welche Einträge markiert werden, das Listenfeld soll anschließend wieder die gleichen Einträge anzeigen wie zuvor.

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