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

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.
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

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 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.
- Ü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«
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.
Abbildung 2.36 Anzeige nach Auswahl eines Elements
- 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

Ä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:
- Mithilfe der Methode Insert() können Sie Elemente zum Listenfeld an einer gewünschten Stelle hinzufügen.
- 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 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.
So sieht das Dialogfeld nach einigen Veränderungen aus (Abbildung 2.39).
Abbildung 2.39 Nach einigen Änderungen
2.7.6 Mehrfachauswahl

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.
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:
- 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.
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 ListBoxen 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 ausgewä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
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
Ihre Meinung
Wie hat Ihnen das Openbook gefallen? Wir freuen uns immer über Ihre Rückmeldung. Schreiben Sie uns gerne Ihr Feedback als E-Mail an kommunikation@rheinwerk-verlag.de.