2.7 Schleifen und Steuerelemente 

In diesem Abschnitt werden die beiden Steuerelemente Listenfeld und Kombinationsfeld eingeführt. Damit können Sie eine einfache oder mehrfache Auswahl aus mehreren Möglichkeiten treffen. Im Zusammenhang mit diesen Steuerelementen werden häufig Schleifen benötigt, wie sie im vorherigen Abschnitt behandelt wurden.
2.7.1 Listenfeld 

Listbox
Ein Listenfeld (Listbox) zeigt eine Liste mit Einträgen an, aus denen der Benutzer einen oder mehrere auswählen kann. Enthält das Listenfeld mehr Einträge, als gleichzeitig angezeigt werden können, erhält es automatisch einen Scrollbalken.
Items
Die wichtigste Eigenschaft des Steuerelements Listbox ist die Collection Items. Sie enthält die einzelnen Listeneinträge. Listenfelder können zur Entwurfszeit gefüllt werden, indem der Eigenschaft Items in einem eigenen kleinen Dialogfeld die Einträge hinzugefügt werden. In der Regel werden Sie ein Listenfeld aber zur Laufzeit füllen.
2.7.2 Listenfeld füllen 

Items.Add()
Bisher wurden die Eigenschaften und Ereignisse von Steuerelementen behandelt. Darüber hinaus gibt es jedoch auch spezifische Methoden, die auf diese Steuerelemente bzw. auf deren Eigenschaften angewendet werden können. Beim Listenfeld ist dies u. a. die Methode Add() der Eigenschaft Items. Diese wird am sinnvollsten zum Zeitpunkt des Ladens des Formulars genutzt.
Im nachfolgenden Programm im Projekt ListenfeldFüllen wird ein Listenfeld für italienische Speisen zu Beginn des Programms mit den folgenden Werten gefüllt: Spaghetti, Grüne Nudeln, Tortellini, Pizza, Lasagne, siehe Abbildung 2.35.
Abbildung 2.35 Listenfeld mit Scrollbalken
Der zugehörige Code:
Public Class Form1 Private Sub Form1_Load(...) Handles MyBase.Load lstSpeisen.Items.Add("Spaghetti") lstSpeisen.Items.Add("Grüne Nudeln") lstSpeisen.Items.Add("Tortellini") lstSpeisen.Items.Add("Pizza") lstSpeisen.Items.Add("Lasagne") End Sub End Class
Listing 2.25 Projekt »ListenfeldFüllen«
Zur Erläuterung:
- Das Ereignis Form1_Load wird ausgelöst, wenn das Formular geladen wird.
- Die einzelnen Speisen werden der Reihe nach dem Listenfeld hinzugefügt. Lasagne steht anschließend ganz unten.
2.7.3 Wichtige Eigenschaften 

Die folgenden Eigenschaften eines Listenfelds bzw. der Collection Items werden in der Praxis häufig benötigt:
- Items.Count gibt die Anzahl der Elemente in der Liste an.
SelectedItem
- SelectedItem beinhaltet das aktuell vom Benutzer ausgewählte Element der Liste. Falls kein Element ausgewählt wurde, ergibt SelectedItem nichts.
- SelectedIndex gibt die laufende Nummer des aktuell vom Benutzer ausgewählten Elements an, beginnend bei 0 für das oberste Element. Falls kein Element ausgewählt wurde, ergibt SelectedIndex den Wert –1.
Items(i)
- Über Items (Index) können Sie die einzelnen Elemente ansprechen, das oberste Element ist Items(0).
Das folgende Programm im Projekt ListenfeldEigenschaften veranschaulicht alle diese Eigenschaften (siehe auch Abbildung 2.36):
Public Class Form1 [...] Private Sub cmdAnzeige_Click(...) Handles ... Dim i As Integer lblAnzeige1.Text = "Anzahl: " & lstSpeisen.Items.Count lblAnzeige2.Text = "Ausgewählter Eintrag: " & lstSpeisen.SelectedItem lblAnzeige3.Text = "Nummer des ausgewählten" & " Eintrags: " & lstSpeisen.SelectedIndex lblAnzeige4.Text = "Alle Einträge:" & vbCrLf For i = 0 To lstSpeisen.Items.Count – 1 lblAnzeige4.Text &= lstSpeisen.Items(i) & vbCrLf Next End Sub End Class
Listing 2.26 Projekt »ListenfeldEigenschaften«
Abbildung 2.36 Anzeige nach Auswahl eines Elements
Zur Erläuterung:
- Das Listenfeld ist bereits gefüllt, siehe Projekt ListenfeldFüllen.
- Die Anzahl der Elemente wird über lstSpeisen.Items.Count ausgegeben, in diesem Fall sind es 5.
- Der ausgewählte Eintrag steht in lstSpeisen.SelectedItem, seine Nummer in lstSpeisen.SelectedIndex.
- Eine For-Schleife dient zur Ausgabe aller Elemente. Sie läuft von 0 bis lstSpeisen.Items.Count – 1. Dies liegt daran, dass bei einer Liste mit fünf Elementen die Elemente mit 0 bis 4 nummeriert sind.
- Die einzelnen Elemente werden mit lstSpeisen.Items(i) angesprochen. Die Variable i beinhaltet bei der Schleife die aktuelle laufende Nummer.
2.7.4 Wechsel der Auswahl 

SelectedIndexChanged
Ähnlich wie beim Kontrollkästchen oder bei der Optionsschaltfläche ist das wichtigste Ereignis einer Listbox nicht der Click, sondern das Ereignis SelectedIndexChanged. Dieses Ereignis zeigt nicht nur an, dass die Listbox vom Benutzer bedient wurde, sondern auch, dass sie ihren Zustand geändert hat. Dies kann z. B. auch durch Programmcode geschehen. Eine Ereignisprozedur zu SelectedIndexChanged() wird in jedem Fall durchlaufen, sobald die Listbox (vom Benutzer oder vom Programmcode) geändert wurde.
Allerdings wird der Programmablauf meist so gestaltet, dass bei einem anderen Ereignis die aktuelle Auswahl der Listbox abgefragt wird und anschließend je nach Zustand unterschiedlich reagiert wird.
Das nachfolgende Programm im Projekt ListenfeldEreignis veranschaulicht diesen Zusammenhang, siehe Abbildung 2.37.
Abbildung 2.37 Anzeige nach dem Ereignis
Der Programmcode:
Public Class Form1 [...] Private Sub cmdEreignis_Click(...) Handles ... lstSpeisen.SelectedIndex = 3 End Sub Private Sub lstSpeisen_SelectedIndexChanged(... ) Handles lstSpeisen.SelectedIndexChanged lblAnzeige.Text = lstSpeisen.SelectedItem End Sub End Class
Listing 2.27 Projekt »ListenfeldEreignis«
Zur Erläuterung:
- Das Listenfeld ist bereits gefüllt, siehe Projekt ListenfeldFüllen.
- In der Ereignisprozedur cmdEreignis_Click() wird die Nummer des ausgewählten Elements auf 3 gesetzt. Dadurch wird in der Listbox Pizza ausgewählt. Im Label wird die geänderte Auswahl sofort angezeigt, da das Ereignis lstSpeisen_SelectedIndexChanged ausgelöst wurde.
- In der zugehörigen Ereignisprozedur lstSpeisen_SelectedIndexChanged() wird die Anzeige des ausgewählten Elements ausgelöst. Dieses wird unmittelbar nach der Auswahl angezeigt. Die Auswahl kann durch einen Klick des Benutzers in der Liste oder auch durch Programmcode ausgelöst werden.
2.7.5 Wichtige Methoden 

Die Methoden Insert() und RemoveAt() können Sie zur Veränderung der Inhalte des Listenfelds nutzen:
Insert()
- Mithilfe der Methode Insert() können Sie Elemente zum Listenfeld an einer gewünschten Stelle hinzufügen.
RemoveAt()
- Die Methode RemoveAt() löscht ein Element an der gewünschten Stelle.
Im nachfolgenden Programm im Projekt ListenfeldMethoden werden die beiden Methoden eingesetzt, um ein Listenfeld zu verwalten, siehe Abbildung 2.38. Es können Elemente eingefügt, gelöscht und geändert werden. Um sicherzustellen, dass es sich hierbei um sinnvolle Operationen handelt, müssen Sie jeweils bestimmte Bedingungen beachten.
Abbildung 2.38 Verwaltung eines Listenfelds
Public Class Form1 [...] Private Sub cmdLöschen_Click(...) Handles ... Dim X As Integer X = lstSpeisen.SelectedIndex If X <> –1 Then lstSpeisen.Items.RemoveAt(X) End If End Sub Private Sub cmdEinfügen_Click(...) Handles ... If txtNeu.Text = "" Then Exit Sub End If If optAnfang.Checked Then lstSpeisen.Items.Insert(0, txtNeu.Text) ElseIf optAuswahl.Checked And lstSpeisen.SelectedIndex <> –1 Then lstSpeisen.Items.Insert( lstSpeisen.SelectedIndex, txtNeu.Text) Else lstSpeisen.Items.Add(txtNeu.Text) End If txtNeu.Text = "" End Sub Private Sub cmdErsetzen_Click(...) Handles ... Dim X As Integer If txtErsetzen.Text <> "" And lstSpeisen.SelectedIndex <> –1 Then X = lstSpeisen.SelectedIndex lstSpeisen.Items.RemoveAt(X) lstSpeisen.Items.Insert( X, txtErsetzen.Text) txtErsetzen.Text = "" End If End Sub Private Sub cmdAllesLöschen_Click(...) Handles ... lstSpeisen.Items.Clear() End Sub End Class
Listing 2.28 Projekt »ListenfeldMethoden«
Zur Erläuterung:
- Das Listenfeld ist bereits gefüllt, siehe Projekt ListenfeldFüllen.
- In der Prozedur cmdLöschen_Click() wird der Wert von SelectedIndex in der Variablen X gespeichert. Anschließend wird untersucht, ob ein Element ausgewählt wurde, ob also der Wert von X ungleich –1 ist. Ist dies der Fall, wird dieses Element mit der Methode RemoveAt() gelöscht. Wurde kein Element ausgewählt, geschieht nichts.
- In der Prozedur cmdEinfügen_Click() wird zunächst untersucht, ob in der Textbox etwas zum Einfügen steht. Ist dies der Fall, wird untersucht, welcher Einfügeort über die Optionsschaltflächen ausgesucht wurde.
- Wurde als Einfügeort das Ende der Liste gewählt, so wird der Inhalt der Textbox mit der bekannten Methode Add()am Ende der Liste angefügt.
- In den beiden anderen Fällen wird die Methode Insert() zum Einfügen des Inhalts der Textbox vor einem vorhandenen Listeneintrag genutzt. Diese Methode benötigt den Index des Elements, vor dem eingefügt werden soll. Dies ist entweder der Wert 0, falls am Anfang der Liste eingefügt werden soll, oder der Wert von SelectedIndex, falls vor dem ausgewählten Element eingefügt werden soll.
- Anschließend wird die Textbox gelöscht, damit nicht versehentlich zweimal das gleiche Element eingefügt wird.
- In der Prozedur cmdErsetzen_Click() wird untersucht, ob in der Textbox etwas zum Ersetzen steht und ob ein Element zum Ersetzen ausgewählt wurde. Ist dies der Fall, wird
- der Wert von SelectedIndex in der Variablen X gespeichert,
- das zugehörige Element mit der Methode RemoveAt() gelöscht,
- der neue Text an der gleichen Stelle mit der Methode Insert() eingefügt
- und die Textbox gelöscht, damit nicht versehentlich zweimal das gleiche Element eingefügt wird.
- In der Prozedur cmdAllesLöschen_Click() dient die Methode Clear() zum Leeren der Listbox.
Nach einigen Veränderungen sieht das Dialogfeld wie in Abbildung 2.39 aus.
Abbildung 2.39 Nach einigen Änderungen
2.7.6 Mehrfachauswahl 

SelectionMode
Sie können es dem Benutzer ermöglichen, gleichzeitig mehrere Einträge aus einer Liste auszuwählen, wie er dies auch aus anderen Windows-Programmen kennt. Dazu wird zur Entwicklungszeit die Eigenschaft SelectionMode auf den Wert MultiExtended gesetzt. Der Benutzer kann anschließend mithilfe der -Taste mehrere einzelne Elemente auswählen oder mithilfe der
-Taste (wie für Großbuchstaben) einen zusammenhängenden Bereich von Elementen markieren.
Hinweis: Nach dem Einfügen einer neuen Listbox in ein Formular steht die Eigenschaft SelectionMode zunächst auf dem Standardwert One, d. h. es kann nur ein Element ausgewählt werden.
SelectedIndices
Die Eigenschaften SelectedIndices und SelectedItems beinhalten die Nummern bzw. die Einträge der ausgewählten Elemente. Sie ähneln in ihrem Verhalten der Eigenschaft Items. Das nachfolgende Programm im Projekt ListenfeldMehrfachauswahl verdeutlicht dies, siehe auch Abbildung 2.40.
Abbildung 2.40 Mehrere ausgewählte Elemente
Der Programmcode:
Public Class Form1 [...] Private Sub cmdAnzeigen_Click(...) Handles ... Dim i As Integer lblAnzeige.Text = "" For i = 0 To lstSpeisen. SelectedItems.Count – 1 lblAnzeige.Text &= lstSpeisen.SelectedItems(i) & vbCrLf Next End Sub End Class
Listing 2.29 Projekt »ListenfeldMehrfachauswahl«
Zur Erläuterung:
SelectedItems(i)
- Das Listenfeld ist bereits gefüllt, siehe Projekt ListenfeldFüllen.
- In der Prozedur cmdAnzeigen_Click() werden alle ausgewählten Elemente mithilfe einer Schleife durchlaufen. Diese Schleife läuft von 0 bis SelectedItems.Count – 1. Die ausgewählten Elemente selbst werden über SelectedItems(i) angesprochen.
2.7.7 Kombinationsfelder 

Das Steuerelement Kombinationsfeld (Combobox) vereinigt die Merkmale eines Listenfelds mit denen eines Textfelds. Der Benutzer kann einen Eintrag aus dem Listenfeldbereich auswählen oder im Textfeldbereich eingeben. Das Kombinationsfeld hat im Wesentlichen die Eigenschaften und Methoden des Listenfelds.
DropDownStyle
Sie können mithilfe der Eigenschaft DropDownStyle zwischen drei Typen von Kombinationsfeldern wählen:
- DropDown: Dies ist der Standard – die Auswahl aus einer Liste (Aufklappen der Liste mit der Pfeiltaste) oder Eingabe in das Textfeld. Das Kombinationsfeld hat die Größe einer Textbox.
- DropDownList: Die Auswahl ist begrenzt auf die Einträge der aufklappbaren Liste, also ohne eigene Eingabemöglichkeit. Dieser Typ Kombinationsfeld verhält sich demnach wie ein Listenfeld, ist allerdings so klein wie eine Textbox. Ein Listenfeld könnte zwar auch auf diese Größe verkleinert werden, aber die Scroll-Pfeile sind dann sehr klein.
- Simple: Die Liste ist immer geöffnet und wird bei Bedarf mit einer Bildlaufleiste versehen. Wie beim Typ DropDown ist die Auswahl aus der Liste oder die Eingabe in das Textfeld möglich. Beim Erstellen eines solchen Kombinationsfelds kann die Höhe wie bei einer Listbox eingestellt werden.
Die Eigenschaft SelectionMode gibt es bei Kombinationsfeldern nicht. Das folgende Programm im Projekt Kombinationsfeld führt alle drei Typen von Kombinationsfeldern vor, siehe auch Abbildung 2.41.
Public Class Form1 Private Sub Form1_Load(...) Handles MyBase.Load cmbWerkzeug1.Items.Add("Zange") cmbWerkzeug1.Items.Add("Hammer") cmbWerkzeug1.Items.Add("Bohrer") cmbWerkzeug1.Items.Add("Schraubendreher")
[... Das Gleiche für die beiden anderen Kombinationsfelder ...]
End Sub Private Sub cmdAnzeigen1_Click(...) Handles ... lblAnzeige1.Text = cmbWerkzeug1.Text End Sub Private Sub cmdAnzeigen2_Click(...) Handles ... lblAnzeige2.Text = cmbWerkzeug2.SelectedItem End Sub Private Sub cmdAnzeigen3_Click(...) Handles ... lblAnzeige3.Text = cmbWerkzeug3.Text End Sub End Class
Listing 2.30 Projekt »Kombinationsfeld«
Abbildung 2.41 Drei verschiedene Kombinationsfelder
Zur Erläuterung:
- Das erste Kombinationsfeld hat den DropDownStyle DropDown. Hat der Benutzer einen Eintrag auswählt, so erscheint dieser in der Textbox des Kombinationsfelds. Falls er selber einen Eintrag eingibt, wird dieser ebenfalls dort angezeigt. Die Eigenschaft Text enthält den Inhalt dieser Textbox, also immer den Wert des Kombinationsfelds.
- Das zweite Kombinationsfeld hat den DropDownStyle DropDownList. Es gibt also keine Textbox. Wie beim Listenfeld ermitteln Sie die Auswahl des Benutzers über die Eigenschaft SelectedItem.
- Das dritte Kombinationsfeld hat den DropDownStyle Simple. Im Programm kann es genauso wie das erste Kombinationsfeld behandelt werden. Die Eigenschaft Text beinhaltet also immer den Wert des Kombinationsfelds.
Übung
Übung ÜListenfeld
Schreiben Sie ein Programm, das zwei Listenfelder beinhaltet, in denen jeweils mehrere Elemente markiert werden können. Zwischen den beiden Listenfeldern befinden sich zwei Buttons, jeweils mit einem Pfeil nach rechts bzw. nach links, siehe Abbildung 2.42. Bei Betätigung eines der beiden Buttons sollen die ausgewählten Elemente in Pfeilrichtung aus der einen Liste in die andere Liste verschoben werden, siehe Abbildung 2.43.
Bei der Lösung kann neben der Eigenschaft SelectedItems z. B. auch die Eigenschaft SelectedIndices genutzt werden. Eine solche Collection beinhaltet dann nicht die ausgewählten Einträge, sondern deren Indizes. Mit dem Löschen mehrerer Einträge aus einem Listenfeld sollten Sie vom Ende der Liste her beginnen. Der Grund hierfür ist: Löschen Sie eines der vorderen Elemente zuerst, stimmen die Indizes in der Collection SelectedIndices nicht mehr.
Abbildung 2.42 Liste vor dem Verschieben
Abbildung 2.43 Liste nach dem Verschieben