Löschen im Listenfeld per Tastatur

Lies diesen Artikel und viele weitere mit einem kostenlosen, einwöchigen Testzugang.

Wenn Sie Daten im Listenfeld anzeigen, die durch den Benutzer etwa per Doppelklick bearbeitet oder per Schaltfläche gelöscht oder erweitert werden sollen, lässt sich dies leicht erledigen. Eher selten trifft man auf Listenfelder, deren Einträge man einfach durch Markieren und Betätigen der Entf-Taste löschen kann. Wie Sie dies programmieren, schauen wir uns im vorliegenden Beitrag an.

Einfach Daten im Listenfeld markieren und mit der Entf-Taste löschen – das wäre in vielen Fällen eine praktische Erweiterung der sonst üblichen Löschen-Schaltfläche. Wenn man mehr als einen Datensatz aus der Liste löschen möchte, muss man sonst nämlich ordentlich mit der Maus arbeiten – markieren, auf Löschen klicken, markieren, auf Löschen klicken …

Das können wir auch einfacher programmieren und dem Benutzer so die Anwendung vereinfachen.

Einträge aus ungebundenem Listenfeld löschen

Als Erstes schauen wir uns an, wie wir Einträge aus einem ungebundenen Listenfeld löschen können. Dieses legen wir unter dem Namen lstUngebunden in einem neuen Formular an. Das Formular soll beim Laden einige Einträge zum Listenfeld hinzufügen, was wir mit folgender Ereignisprozedur erledigen:

Private Sub Form_Load()
     Dim i As Integer
     Me!lstUngebunden.RowSourceType = "Value List"
     For i = 1 To 10
         Me!lstUngebunden.AddItem "Eintrag " & i
     Next i
End Sub

Die Prozedur stellt die Eigenschaft Herkunftsart des Listenfeldes auf Wertliste ein und fügt innerhalb einer For…Next-Schleife zehn durchnummerierte Einträge zum Listenfeld hinzu.

Dies liefert das Listenfeld mit den Einträgen aus Bild 1. Wenn wir nun einen der Einträge per Tastatur mit der Entf-Taste löschen wollen, müssen wir die Tastenereignisse des Listenfeldes hinzuziehen. In diesem Fall wollen wir den Eintrag löschen, sobald der Benutzer die Entf-Taste herunterdrückt. Dazu hinterlegen wir die Ereignisprozedur aus Listing 1 für das Ereignis Bei Taste ab des Listenfeldes.

Listenfeld mit Beispieldaten

Bild 1: Listenfeld mit Beispieldaten

Die Prozedur prüft, ob der Wert des Parameters KeyCode, der beim Herunterdrücken der Taste geliefert wird, der Zahl 46 entspricht. In diesem Fall ermittelt die Prozedur den Index des aktuell markierten Eintrags im Listenfeld und schreibt diesen in die Variable lngItem.

Diese Variable prüft die folgende If…Then-Bedingung auf den Wert -1. Ist der Wert nicht gleich -1, ruft die Prozedur die RemoveItem-Methode des Listenfeldes auf und übergibt mit lngItem den Index der zu löschenden Zeile. Damit wird der aktuell markierte Eintrag entfernt. Das Listenfeld behält den Fokus, aber danach ist kein Datensatz markiert (siehe Bild 2). Sollten wir die Markierung nach dem Löschen auf einen anderen Datensatz verschieben Denkbar wäre, dass der Benutzer beispielsweise von oben nach unten einige Datensätze löschen möchte. Also markieren wir nach dem Löschen den Datensatz, der sich direkt unterhalb des gelöschten Datensatzes befunden hat.

Listenfeld nach dem Löschen eines Datensatzes

Bild 2: Listenfeld nach dem Löschen eines Datensatzes

Dazu haben wir hinter der Zeile mit der RemoveItem-Methode zunächst die folgende Zeile eingefügt:

Me!lstUngebunden.ListIndex = lngItem

Damit kann der Benutzer nun durch mehrmaliges Betätigen der Entf-Taste mehrere untereinander liegende Einträge hintereinander löschen, ohne zwischendurch einen neuen Datensatz markieren zu müssen. Soll ein Datensatz nicht gelöscht werden, kann der Benutzer den nächsten Datensatz mit den Nach oben– und Nach unten-Tasten ansteuern.

Allerdings war dies etwas zu kurz gedacht, denn die Prozedur lieferte einen Fehler, wenn wir den letzten vorhandenen Eintrag gelöscht haben – und auch das Löschen des letzten Eintrags der Liste lieferte regelmäßig einen Fehler.

Also haben wir noch ein paar verschachtelte Bedingungen hinzugefügt. Die erste fragt ab, ob das Listenfeld überhaupt noch Einträge enthält. Falls nicht, wird auch kein Eintrag mehr markiert. Falls doch, prüfen wir, ob lngItem, also der Index des gelöschten und des nun zu markierenden Datensatzes, der letzte Eintrag im Listenfeld ist. Falls nein, wird einfach der Eintrag mit dem Index des gelöschten Eintrags markiert, also der erste Eintrag hinter dem gelöschten Eintrag. Sollten wir uns schon an der letzten Position befinden, markiert die Prozedur den letzten Eintrag des Listenfeldes.

Auf diese Weise können wir auch den hinteren Eintrag markieren und von dort aus alle Einträge von hinten nach vorne löschen, ohne dass wir zwischendurch einen Eintrag von Hand markieren müssen.

Mehrfachauswahl löschen

Nun wollen wir uns ansehen, wie wir Einträge aus einem Listenfeld löschen können, für das die Mehrfachauswahl aktiviert ist. Dazu fügen wir dem Beispielformular ein weiteres Listenfeld namens lstUngebundenMehrfach hinzu, dessen Eigenschaft Mehrfachauswahl wir auf Einfach oder Erweitert einstellen. Damit auch dieses Listenfeld mit einigen Beispieleinträgen gefüllt wird, fügen wir der For…Next-Schleife der Prozedur Form_Load die folgende Zeile hinzu:

Me!lstUngebundenMehrfach.AddItem "Eintrag " & i

In diesem Fall können wir nicht nur einen, sondern mehrere Einträge markieren (siehe Bild 3). Wir fügen der Prozedur, die durch das Ereignis Bei Taste ab des Listenfeldes lstUngebundenMehrfach ausgelöst wird, die Zeilen aus Listing 2 hinzu.

Löschen einer Mehrfachauswahl

Bild 3: Löschen einer Mehrfachauswahl

Wenn wir dann die Einträge wie im Bild oben markieren und auf die Entf-Taste klicken, wird nur der erste Eintrag gelöscht. Warum das Weil durch das Löschen des ersten Eintrags und damit der Aktualisierung des Listenfeldes auch die vorhandenen Markierungen entfernt werden.

Also müssen wir dies etwas anders angehen und die Indizes der zu löschenden Einträge erst in einem Array zwischenspeichern.

Die programmieren wir in der neuen Version der Prozedur, die Sie in Listing 3 finden. Hier verwenden wir gleich drei neue Variablen, nämlich i und l mit dem Datentyp Long und ein Array namens arrItems ebenfalls mit dem Datentyp Long. Wenn der Benutzer die Entf-Taste gedrückt hat, durchlaufen wir wie zuvor eine For Each-Schleife über alle markierten Elemente des Listenfeldes und redimensionieren das Array jeweils auf die Anzahl der erfolgten Durchläufe.

Private Sub lstUngebundenMehrfach_KeyDown(KeyCode As Integer, Shift As Integer)
     Dim varItem As Variant
     Dim arrItems() As Long
     Dim l As Long
     Dim i As Integer
     Select Case KeyCode
         Case 46
             For Each varItem In Me!lstUngebundenMehrfach.ItemsSelected
                 ReDim Preserve arrItems(i)
                 arrItems(i) = varItem
                 i = i + 1
             Next varItem
             For l = i - 1 To 0 Step -1
                 Me!lstUngebundenMehrfach.RemoveItem arrItems(l)
             Next l
     End Select
End Sub

Listing 3: Zweiter Versuch, Einträge aus der Mehrfachauswahl eines Listenfeldes zu löschen

Um diese zu zählen, erhöhen wir jeweils die Variable i um den Wert 1. Der Position des Arrays mit dem Indexwert aus i weisen wir dabei jeweils den Index beziehungsweise die Position des soeben bearbeiteten Listeneintrags zu – in diesem Beispiel erhalten also etwa die Zeilen 0, 1 und 2 des Arrays die Werte 0, 2 und 4. Nach dem Durchlaufen wissen wir über den Wert von i, wieviele Zeilen gelöscht werden sollen. In einer For…Next-Schleife mit der Schrittweite -1 durchlaufen wir dann die Werte von i-1 bis 0.

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

Testzugang

eine Woche kostenlosen Zugriff auf diesen und mehr als 1.000 weitere Artikel

diesen und alle anderen Artikel mit dem Jahresabo

Schreibe einen Kommentar