Site logo
Site logo
Programmieren aus Leidenschaft
Programmieren aus Leidenschaft

Textbox für numerischen Inhalt


Machmal kann es durchaus sinnvoll sein, bestimmte Benutzereingaben gar nicht erst zu zulassen. Will man zum Beispiel mit dem Inhalt verschiedenen Textboxen Berechnungen durchzuführen so ist es müßig, zu prüfen ob der Inhalt jeder Textbox tatsächlicher eine Zahl ist.

Glücklicherweise haben Textboxen Ereignisse, die es uns erlauben, einen eingegeben Wert zu überprüfen, bevor er in der Textbox erscheint. Das für uns wichtige Ereignis ist „KeyPress“ und es wird jedes Mal ausgeführt, wenn ein Zeichen in die Textbox eingegeben wird, oder genauer gesagt, wenn eine Taste gedrückt wird. Es gibt schließlich auch Tasten die keine Zeichen schreiben.

Will man auf das KeyPress-Ereignis reagieren sieht die Methode dafür so aus:
private void textBox1_KeyPress(object sender, KeyPressEventArgs e)
{

}
Während “sender“ für uns uninteressant ist enthält “e“ die gedrückte Taste. In der Vergangenheit wäre man jetzt sicherlich hingegangen und hätte mit dem ASCII-Wert der gedrückten Taste verschiedenen Vergleiche durchgeführt. Inzwischen ist es aber etwas einfacher geworden.
Überlegen wir aber zuerst was wir genau möchten: Wir wollen Zahlen eingeben können, aber natürlich müssen auch Tasten wie „Backspace“ oder die Cursortasten noch funktionieren. Es kann ja passieren das der Benutzer sich vertippt und seine Eingabe korrigieren will.

Das Resultat ist überraschend einfach :
private void textBox1_KeyPress(object sender, KeyPressEventArgs e)
{
   if (!char.IsDigit(e.KeyChar ) && !char.IsControl(e.KeyChar))
      e.Handled = true;
}
Ist der “KeyChar“ von “e“ kein Digit (Zahl) und auch kein Control (Cursortaste) dann soll “Handled = true“ sein. Die Eigenschaft “Handled“ gibt, wörtlich übersetzt, an, ob dieser Tastendruck schon behandelt wurde, also in die Textbox geschrieben wurde. Setzen wir diese Eigenschaft manuell verhindern wir, das unsere Eingabe in der Textbox erscheint.

Hat man ein Formular mit sehr vielen Textboxen für ausschließlich numerische Eingaben, ist es natürlich nicht besonders elegant für jede dieser Textboxen das „KeyPress“-Ereignis abzufangen. In diesem Fall empfiehlt sich eine eigene Klasse für diese Art von Textbox. Solch eine Klasse ist problemlos von Basisklasse ableitbar. Wir müssen nur eine einzige Methode überschreiben:
public class NumTextBox : TextBox
{
   protected override void OnKeyPress(KeyPressEventArgs e)
   {
      if (!char.IsDigit(e.KeyChar) && !char.IsControl(e.KeyChar))
         e.Handled = true;

      base.OnKeyPress(e);
   }
}