12.6 Texteingabefelder (TextBox)
Texteingabefelder, die auf Instanzen der Klasse TextBox basieren, die aus der abstrakten Klasse TextBoxBase abgeleitet ist, lassen sich in zwei Gruppen kategorisieren:
- einzeilige Eingabefelder
- mehrzeilige Eingabefelder
Beiden ist ein besonderes Merkmal zu eigen: Die in einem Texteingabefeld angezeigte Zeichenfolge ist immer von derselben Schriftart, -darstellung und -größe.
12.6.1 Einzeilige Eingabefelder
Widmen wir uns zunächst den einzeiligen Eingabefeldern. Die wichtigste Eigenschaft beschreibt die angezeigte Zeichenfolge und heißt Text. Standardmäßig wird die Zeichenfolge am linken Rand des Steuerelements ausgerichtet; sie kann allerdings auch mit der Eigenschaft TextAlign mittig oder rechts in der Textbox angezeigt werden. Die Anzahl der Zeichen, die in Sie eine Textbox eingegeben dürfen, wird durch die Eigenschaft MaxLength beschränkt. Die Länge des aktuellen Inhalts steht in der schreibgeschützten Eigenschaft TextLength.
Wenn Sie eine Textbox aus der Toolbox in die Arbeitsfläche des Formulars ziehen und versuchen, die Höhe der Textbox manuell einzustellen, werden Sie feststellen, dass sich diese Größe unter Zuhilfenahme der Markierungspunkte nicht verändern lässt. Standardmäßig passt sich die Höhe einer Textbox immer der eingestellten Schriftgröße an, die auf 8,25 Punkt voreingestellt ist.
Ändern Sie die Schriftgröße, ändert sich die Höhe der Textbox automatisch. Dieses Verhalten ist insbesondere dann inakzeptabel, wenn zur Laufzeit die Schriftgröße durch den Anwender verändert werden kann. Dann kann die Textbox ein anderes Steuerelement überdecken. Die Ursache für dieses Verhalten ist die Eigenschaft AutoSize. Diese gibt mit dem Standardwert True an, dass die Höhe des Steuerelements automatisch angepasst wird, wenn die dem Steuer-element zugewiesene Schriftgröße geändert wird. Wollen Sie die Höhe der Textbox dennoch manuell festlegen, legen Sie die AutoSize-Eigenschaft auf False fest. Leider wird AutoSize nicht im Eigenschaftsfenster angezeigt, kann also nur im Code verändert werden.
Mit der Eigenschaft PasswordChar können Sie die Eingabe mit einem Zeichen maskieren. Das ist bei Eingabefeldern interessant, die Passwörter entgegennehmen. Um zum Beispiel das häufig verwendete Zeichen »*« als Maskierung zu verwenden, sieht die Zuweisung, die natürlich auch im Eigenschaftsfenster der Textbox erfolgen kann, folgendermaßen aus:
textBox1.PasswordChar = "*"c
Mit CharacterCasing können Sie festlegen, ob bei der Eingabe die Groß- und Kleinschreibung beibehalten wird oder die eingegebenen Zeichen in Groß- oder Kleinbuchstaben konvertiert werden. Sie können die drei Werte Normal, Lower und Upper angeben.
Arbeiten mit ausgewähltem Text
In einem Textfeld kann die gesamte Zeichenfolge oder ein Teil von ihr markiert werden, beispielsweise um den markierten Text zu kopieren oder auszuschneiden. Dabei sind drei Eigenschaften eines TextBox-Objekts von Bedeutung: SelectionStart, SelectionLength und SelectedText. Sie sind in der Elternklasse TextBoxBase definiert.
Positionsangaben für die markierte Auswahl sind als Integer gespeichert.
Public Property SelectionStart As Integer Public Overridable Property SelectionLength As Integer |
Nehmen wir an, es sei die Zeichenfolge »Visual Studio« in einer Textbox eingetragen und darin der Teilstring »sual« markiert. SelectionStart gibt uns dann die Zahl 2 zurück, da der markierte Teilstring nach dem zweiten Zeichen beginnt. Es muss aber nicht unbedingt ein Zeichen markiert sein, denn das Auswerten dieser Eigenschaft liefert grundsätzlich immer die Position der Einfügemarke zurück, wenn die Textbox fokussiert ist. SelectionStart ist keine schreibgeschützte Eigenschaft und kann daher auch zum Positionieren der Einfügemarke benutzt werden, solange die Eigenschaft SelectionLength, die die Anzahl der markierten Zeichen zurückgibt, den Wert 0 hat.
Wollen Sie programmgesteuert einen bestimmten Teil einer Zeichenfolge markieren, müssen Sie sowohl für SelectionStart als auch für SelectionLength Werte angeben. Die Eigenschaft SelectedText liefert schließlich den markierten Teilstring aus dem Steuerelement.
Im Beispiel SelectedText werden alle drei Eigenschaften exemplarisch eingesetzt. Abbildung 12.6 zeigt die grafische Benutzeroberfläche des Beispiels. Im obersten Eingabefeld wird nach dem Start eine Zeichenfolge angezeigt. Wird auf die Schaltfläche Text kopieren geklickt, wird der markierte Teilstring der oberen Textbox in die darunterliegende kopiert.
Abbildung 12.6 Eingabemaske des Beispiels »SelectedText«
Sehen wir uns nun den Programmcode an:
'...\WinControls\Selektionen\SelectedText.vb |
Public Class SelectedText Private Sub Kopieren_Click(ByVal sender As Object, ByVal e As EventArgs) _ Handles Kopieren.Click MessageBox.Show("Start nach : " & Original.SelectionStart & _ Environment.NewLine & "Anzahl Zeichen : " & Original.SelectionLength) Kopie.Text = Original.SelectedText Original.Focus() End Sub Private Sub Markieren_Click(ByVal sender As Object, ByVal e As EventArgs) _ Handles Markieren.Click Original.SelectionStart = Convert.ToInt32(Start.Text) Original.SelectionLength = Convert.ToInt32(Länge.Text) Start.Text = "" Länge.Text = "" Markieren.Enabled = False Original.Focus() End Sub Private Sub Bereich(ByVal sender As Object, ByVal e As EventArgs) _ Handles Start.TextChanged, Länge.TextChanged Markieren.Enabled = Start.Text <> "" AndAlso Länge.Text <> "" End Sub End Class
Im Ereignishandler Kopieren() lassen wir uns zuerst in einer Meldungsbox die Startposition und die Länge des Teilstrings ausgeben, der in der obersten Textbox markiert ist. Erst danach kopiert der Handler den markierten Teil der Zeichenfolge mit
Kopie.Text = Original.SelectedText
in das zweite Eingabefeld.
Die Eigenschaft Enabled der Schaltfläche Text markieren ist im Eigenschaftsfenster auf False gesetzt. Wenn die Anwendung gestartet wird, ist diese Schaltfläche also deaktiviert. Es ist nur dann sinnvoll, sie zu aktivieren, wenn in den beiden Textboxen der GroupBox ein gültiger Wert enthalten ist. Dies kann nur passieren, wenn die Texte in den beiden Boxen geändert werden. Jede Textänderung löst das Ereignis TextChanged aus, sodass dessen Handler gut geeignet ist, um den Aktivierungszustand der Schaltfläche zu kontrollieren.
Da die Überprüfung in den TextChanged-Ereignissen der beiden Eingabefelder identisch ist, reicht ein Ereignishandler zur Behandlung beider Ereignisse aus. Er kann im Eigenschaftsfenster zugewiesen werden, wenn man sich in der rechten Spalte die Liste aller passenden Ereignisse anzeigen lässt. Der Ereignishandler im Beispiel heißt Bereich().
Jedes Mal, wenn sich der Inhalt einer der beiden Textboxen im Rahmen ändert, muss geprüft werden, ob in diesem Augenblick beide einen Inhalt aufweisen:
Markieren.Enabled = Start.Text <> "" AndAlso Länge.Text <> ""
Nur wenn beide Textboxen nicht leer sind, wird die Schaltfläche Text markieren aktiviert.
Im Ereignishandler des Click-Ereignisses der Schaltfläche Text markieren muss die Eingabe der Startposition und der Markierungslänge aus den Eingabefeldern zuerst in einen Integer konvertiert werden. Da sich der übliche Konvertierungsoperator dazu nicht eignet, greifen wir auf die Methode ToInt32 der Klasse Convert zurück. Beide Rückgabewerte werden der entsprechenden Eigenschaft des oberen Eingabefeldes zugewiesen. Anschließend werden die Inhalte der Textboxen im Rahmen geleert.
Zum Schluss dürfen wir eine wichtige Anweisung nicht vergessen: Solange die Textbox nicht den Fokus hat, werden wir auch keinen markierten Text sehen. Mit der Methode Focus() wird die Textbox fokussiert.
Prüfung auf Änderung einer Textbox
Als ausgesprochen nützlich kann sich die Eigenschaft Modified erweisen, die als boolescher Wert die Information darüber liefert, ob sich der Inhalt einer Textbox geändert hat. Ändert der Anwender durch eine Eingabe den Inhalt der Textbox, setzt die Textbox Modified von False auf True. Allerdings darf man auch nicht vergessen, die Eigenschaft nach der Verarbeitung der Änderung manuell wieder auf False zurückzusetzen, denn das passiert nicht automatisch.
Automatische Vervollständigung
Textboxen unterstützen Autovervollständigung. Dieses Feature unterstützt den Benutzer bei seinen Eingaben, indem es aus einer Liste den nächsten passenden Eintrag sucht und die Benutzereingabe nach rechts um einen Vorschlag erweitert.
Nur drei Eigenschaften bewirken die Autovervollständigung:
- AutoCompleteCustomSource
- AutoCompleteMode
- AutoCompleteSource
Die Autovervollständigung setzt zunächst voraus, dass AutoCompleteMode auf einen Wert ungleich None gesetzt wird. Dazu stehen Ihnen die Konstanten der Enumeration AutoCompleteMode zur Verfügung, die Sie der Tabelle 12.5 entnehmen können.
Konstante | Beschreibung |
Append |
Ergänzt die aktuelle Benutzereingabe mit dem ersten Listeneintrag, der genauso beginnt und markiert die angehängte Zeichenfolge. |
None |
Autovervollständigung ist abgeschaltet (Standardeinstellung). |
Suggest |
Öffnet eine Liste aller passenden Kandidaten, aus der der Benutzer mit den Pfeiltasten einen Eintrag auswählen kann. |
SuggestAppend |
Ergänzt die aktuelle Benutzereingabe und öffnet die Vorschlagsliste. |
Abbildung 12.7 zeigt die Unterschiede zwischen den drei Konstanten zur Laufzeit.
Abbildung 12.7 Darstellung der Autovervollständigung, abhängig von der Einstellung »AutoCompleteMode«
Es stellt sich die Frage, aus welcher Liste die Informationen zur Vervollständigung oder Auswahl bezogen werden. Die Quelle wird in der Eigenschaft AutoCompleteSource spezifiziert, deren Typ die gleichnamigen Enumeration ist. Je nachdem, was im Eingabefeld eingetragen werden soll, können Sie auf verschiedene interne Systemlisten zurückgreifen, beispielsweise auf HistoryList, Filesystem oder AllUrl.
Eine weitere Möglichkeit ist die Einstellung CustomSource, um eine eigene Liste zur Verfügung zu stellen. Diese kann bereits zur Entwicklungszeit gefüllt werden, aber auch dynamisch zur Laufzeit. Die selbst definierte Liste wird durch die dritte Eigenschaft im Bunde, AutoCompleteCustomSource, beschrieben. Im Eigenschaftsfenster brauchen Sie nur auf die Schaltfläche in der Wertespalte zu klicken, um in dem sich daraufhin öffnenden Dialog die Listenelemente einzutragen:
Abbildung 12.8 Benutzerdefinierte Liste für die Autovervollständigung
AutoCompleteCustomSource liefert die Referenz auf eine Collection vom Typ AutoCompleteStringCollection. Wollen Sie die Liste zur Laufzeit füllen oder bestehende Einträge ergänzen, stehen Ihnen die üblichen Methoden Add und AddRange nebst allen anderen Methoden zur vollständigen Verwaltung der gesamten Auflistung zur Verfügung (Remove, Insert usw.).
Methoden eines einzeiligen Textfeldes
Eine Reihe von Methoden erleichtert und unterstützt die Programmierung von Textboxen. Dazu gehört die Methode Select, mit der wir Text im Steuerelement markieren können.
Public Sub [Select](start As Integer, length As Integer) |
Der erste Parameter legt die Position des ersten Zeichens in der aktuellen Textmarkierung des Textfeldes fest, der zweite die Anzahl der zu markierenden Zeichen. Sie ist äquivalent zur Zuweisung der beiden Eigenschaften SelectionStart und SelectionLength.
Die Methode SelectAll markiert den gesamten Text im Textfeld:
Public Sub SelectAll() |
Soll der gesamte Inhalt einer Textbox beim Erhalt des Fokus markiert werden, rufen Sie die Methode SelectAll im Enter-Ereignis der Textbox auf:
Private Sub textBox1_Enter(sender As object, e As EventArgs) textBox1.SelectAll() End Sub
Mit der Methode Clear weisen Sie der Text-Eigenschaft eine leere Zeichenfolge zu.
Um den Inhalt einer Textbox zu ergänzen, werden Sie vermutlich meistens eine Anweisung ähnlich der folgenden programmieren:
textBox1.Text += " weiterer Text."
Die Methode AppendText bietet dazu eine Alternative an:
Public Sub AppendText([text] As String) |
Beispiel:
textBox1.AppendText(" weiterer Text.")
Das TextBox-Steuerelement kann in gewohnter Weise die Zwischenablage nutzen. Sie müssen dazu nur den Mauszeiger auf markierten Text positionieren und mit der rechten Maustaste das Kontextmenü öffnen. Zum Ausschneiden, Kopieren, Einfügen und Löschen stehen dem Anwender die üblichen Funktionalitäten zur Verfügung, ohne dass Sie dazu auch nur eine Zeile Code schreiben müssen. Alternativ kann der Anwender auch mit den Tastenkombinationen + den markierten Text löschen, mit + den markierten Text in die Zwischenablage kopieren oder mit + den Inhalt der Zwischenablage an der Position der Einfügemarke einfügen.
Mit den Methoden Cut, Copy und Paste der Textbox können Sie auch direkt im Programmcode mit der Zwischenablage zusammenarbeiten. Mit Cut() wird der markierte Text ausgeschnitten und in die Zwischenablage geschoben. Dabei muss Text im Eingabefeld markiert sein. Sehr ähnlich arbeitet die Methode Copy(), jedoch ohne dabei gleichzeitig den markierten Text zu entfernen. Soll der Inhalt der Zwischenablage an der Position der Einfügemarke in die Textbox eingefügt werden, müssen Sie die Methode Paste() aufrufen. Um die jeweils letzte Operation rückgängig zu machen, rufen Sie Undo auf. Alle Methoden sind parameterlos und haben keinen Rückgabewert.
12.6.2 Mehrzeilige Eingabefelder
Aus einem einzeiligen ein mehrzeiliges Textfeld zu machen, ist sehr einfach: Sie müssen nur die Eigenschaft MultiLine=True setzen. Danach lässt sich auch die Höhe der Textbox beliebig festlegen, denn die Eigenschaft AutoSize verliert damit selbst dann ihre Wirkung, wenn sie weiterhin auf True gesetzt ist.
Das Ergebnis wird allerdings noch nicht alle Ansprüche befriedigen können. Gibt der Anwender einen Text ein, der breiter als die Textbox ist, wird dieser in der nächsten Zeile fortgesetzt. Überschreitet der Text die Höhe der Textbox, verlässt der zuerst eingegebene Text den oberen Teil des Anzeigefensters. Nur mit den Pfeiltasten lässt sich dann zur Laufzeit wieder zum Textanfang navigieren. Viel komfortabler sind Bildlaufleisten, die über die Eigenschaft ScrollBars vom Typ der gleichnamigen Enumeration angeschaltet werden (siehe Tabelle 12.6).
Konstante | Beschreibung |
None |
Es werden keine Bildlaufleisten angezeigt. |
Horizontal |
Nur eine horizontale Bildlaufleiste wird angezeigt. |
Vertical |
Nur eine vertikale Bildlaufleiste wird angezeigt. |
Both |
Beide Bildlaufleisten, horizontal und vertikal, werden angezeigt. |
Wenn Sie der Eigenschaft ScrollBars eines mehrzeiligen Eingabefelds die Einstellung Both oder Horizontal zuweisen, wird trotzdem keine horizontale Bildlaufleiste angezeigt. Verantwortlich dafür ist die Eigenschaft WordWrap, die auf True voreingestellt ist. Sie bewirkt, dass der eingegebene Text automatisch umbrochen wird, wenn die Textbreite die Breite der Textbox überschreitet. Hat WordWrap den Wert False, wird zuerst eine deaktivierte horizontale Bildlaufleiste angezeigt, die erst aktiviert wird, wenn zur Laufzeit die Notwendigkeit dazu besteht. Die Einstellung bewirkt zudem, dass der Anwender so lange Text in eine Zeile schreiben kann, bis er mit der -Taste einen Zeilenumbruch erzwingt.
Oft möchte man die einzelnen Zeilen eines Textfeldes getrennt auslesen. Dazu müssen Sie nicht den gesamten Inhalt einer Textbox nach den Zeilenumbrüchen durchsuchen, denn die Eigenschaft Lines speichert die Zeilen in einem String-Array. Der Text bis zum ersten Zeilen-umbruch hat den Index 0, der bis zum zweiten Zeilenumbruch den Index 1 usw. Beispielsweise liefert die Anweisung
Dim str As String = textBox1.Lines(2)
den Inhalt der dritten Zeile, vorausgesetzt, in der Textbox ist eine solche enthalten. Ansonsten wird eine Ausnahme ausgelöst. Daher empfiehlt es sich, vor dem Zugriff mit der Eigenschaft Length die Gesamtanzahl der Elemente im Array zu prüfen, zum Beispiel so:
If textBox1.Lines.Length > 2 Then str = textBox1.Lines(2)
Sie können über die Eigenschaft Lines einem Eingabefeld auch einen Inhalt zuweisen. Übergeben Sie dazu ein Array mit dem gewünschten Text. Jedes Array-Element wird dann in einer eigenen Zeile angezeigt:
Dim stadt As String = "München" Dim stra As string() = New String(){"Berlin","Hamburg", stadt} textBox1.Lines = str
Wollen Sie einer mehrzeiligen Textbox mehrere Zeilen übergeben, müssen Sie nicht die Lines-Eigenschaft benutzen, sondern können der Eigenschaft Text eine Zeichenkette mit Zeilenvorschüben zuweisen:
Dim str As String = "Berlin" & vbNewLine & "Hamburg" & vbNewLine & "München" textBox1.Text = str
Mehrzeilige Textfelder und die Tastatur
In Forms haben die - und die -Taste eine besondere Bedeutung: Mit der -Taste bewegt man den Fokus von einem fokussierbaren Steuerelement zum nächsten, und mit der Eingabetaste wird üblicherweise die OK-Schaltfläche aktiviert sowie der Ereignishandler ausgeführt, der mit dem Click-Ereignis verknüpft ist. Während der Fokuswechsel mit der -Taste das Standardverhalten einer Form ist, wird mit der Eigenschaft AcceptButton der Form eine Schaltfläche (meist die OK-Schaltfläche) zur Standardfläche der Eingabetaste gemacht.
Bei mehrzeiligen Textfeldern ist häufig ein anderes Verhalten dieser beiden Tasten wünschenswert. Der Anwender erwartet, dass mit der Eingabetaste ein Zeilenumbruch und mit der Tabulatortaste ein Tabstopp-Zeichen in das Steuerelement eingefügt wird. Damit die beiden Tasten diesen Erwartungen entsprechen, müssen zwei Eigenschaften des TextBox-Objekts auf True gesetzt werden: AcceptsReturn und AcceptsTab. Um mit der Einstellung AcceptsTab=True den Fokus zum nächsten Steuerelement zu verschieben, muss der Anwender nun allerdings die Tastenkombination + betätigen.
Enthält das Formular keine Schaltfläche, die mit der Eigenschaft AcceptButton der Form zur Standardschaltfläche des Formulars wird, wirkt sich das Drücken der Eingabetaste unabhängig von der Einstellung der Eigenschaft AcceptsReturn immer als Zeilenumbruch aus.
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.