InputBox im Eigenbau

Wenn Sie ein Abonnement des Magazins 'DATENBANKENTWICKLER' besitzen, können Sie sich anmelden und den kompletten Artikel lesen.
Anderenfalls können Sie das Abonnement hier im Shop erwerben.

InputBox im Eigenbau

Wer von Access/VBA kommt, kann unter WPF die »MsgBox«-Anweisung leicht mit den Funktionen der Klasse »MessageBox« ersetzen. Allerdings sucht man vergeblich nach einem Pendant zur InputBox-Funktion, die ja ein einfaches Eingabefenster für die Eingabe eines Textes zur Verfügung stellt. Doch das ist kein Problem: Unter C#/WPF können Sie ja eigene Fenster erstellen. Warum dann nicht ein Fenster mit Titel, Text, Eingabefeld und OK/Abbrechen-Schaltflächen bauen und dieses bei Bedarf aufrufen?

Vorgaben InputBox

Was soll eine InputBox überhaupt alles leisten? Wir richten uns im Wesentlichen nach der InputBox von Access/VBA. Diese wird wie folgt aufgerufen, wenn man die hinteren Parameter etwa für die Position und für die Onlinehilfe weglässt:

Debug.Print InputBox("Geben Sie einen Text ein.", "Texteingabe", "[Hier eingeben]")

Die Debug.Print-Anweisung gibt den zurückgelieferten Wert im Direktfenster des VBA-Editors aus. Wie Sie sehen, verwenden wir hier drei Parameter:

  • Prompt: Text, der den Benutzer informiert, welche Eingabe von ihm erwartet wird
  • Title: Text für die Titelleiste des Fensters (optional)
  • Default: Text, der als Vorgabe im Textfeld angezeigt werden soll (optional)

Die InputBox selbst sieht dann wie in Bild 1 aus. Hier gibt es vier Steuerelemente: das Bezeichnungsfeld für den Text aus dem Parameter Prompt, das Textfeld zur Eingabe des gesuchten Wertes durch den Benutzer, das gegebenenfalls den Wert aus Default anzeigt, sowie die beiden Schaltflächen OK und Abbrechen.

InputBox unter VBA

Bild 1: InputBox unter VBA

Wenn der Benutzer die OK-Schaltfläche betätigt, soll die Funktion InputBox den aktuell im Textfeld befindlichen Text zurückliefern, bei Betätigung der Abbrechen-Schaltfläche soll eine leere Zeichenfolge zurückgegeben werden.

Wenn der Benutzer die Eingabetaste drückt, löst er die Funktion der OK-Schaltfläche aus, die Escape-Taste bewirkt selbiges für die Abbrechen-Schaltfläche.

InputBox als Fenster

Um ein Projekt mit einem Fenster auszustatten, das als InputBox dient, fügen Sie diesem einfach ein normales Objekt des Typs Fenster (WPF) hinzu. Nennen Sie das Fenster im Dialog Neues Element hinzufügen schlicht InputBox. Das Fenster statten Sie mit den Steuerelementen aus Bild 2 aus (das Bezeichnungsfeld haben wir markiert, damit man es überhaupt erkennt).

Fenster zur Anzeige einer InputBox im Entwurf

Bild 2: Fenster zur Anzeige einer InputBox im Entwurf

Der XAML-Code des Fensters sieht wie in Listing 1 aus.

Listing 1: Code des WPF-Fensters, das als InputBox dienen soll

Hier stecken einige Besonderheiten: Das Fenster soll zentriert erscheinen, also erhält das Window-Element den Wert CenterScreen für die Eigenschaft WindowStartupLocation.

Die Steuerelemente haben wir in einem Grid arrangiert. In der letzten Zeile des Grids haben wir außerdem ein StackPanel mit dem Wert Horizontal für das Attribut Orientation eingebaut, damit wir darin die Schaltflächen nebeneinander anordnen können. Die Schaltfläche cmdOK erhält für die Eigenschaft IsDefault den Wert true, damit sie beim Betätigen der Eingabetaste ausgelöst wird. cmdAbbrechen statten wir mit dem Wert true für das Attribut IsCancel aus, so löst das Betätigen der Taste Escape diese Schaltfläche aus.

Code hinter dem InputBox-Fenster

Die Code behind-Datei zu unserer InputBox finden Sie in Listing 2. Die Konstruktor-Methode namens InputBox erwartet die Übergabe dreier Parameter namens Titel, Bezeichnung und Standardwert. Sie initialisiert das Fenster und trägt dann den Wert des Parameters Bezeichnung für das Attribut Content des Elements lblBezeichnung ein. Der Wert des Parameters Titel wird zunächst überprüft. Wenn der Aufruf diesen Parameter nicht enthält, erhält dieser zunächst als Standardwert eine leere Zeichenfolge. Die Methode prüft dann, ob Titel leer ist, und ersetzt diesen Wert dann durch den aktuellen Anwendungstitel, der mit System.AppDomain.CurrentDomain.FriendlyName ermittelt wird. Danach landet der Inhalt von Titel im Attribut Title des Window-Elements, das mit this referenziert wird. Der Wert des Parameters Standardwert wird schließlich in die Eigenschaft Text des Textfeldes txtEingabe eingesetzt.

using System.Windows;
namespace InputBoxImEigenbau {
     public partial class InputBox : Window {
         string eingabe;
         public InputBox(string Bezeichnung, string Titel = "", string Standardwert="") {
             InitializeComponent();
             this.lblBezeichnung.Content = Bezeichnung;
             if (Titel=="") {
                 Titel = System.AppDomain.CurrentDomain.FriendlyName;
             }
             this.Title = Titel;
             this.txtEingabe.Text = Standardwert;
             this.txtEingabe.SelectAll();
             this.txtEingabe.Focus();
         }
         public string Eingabe
         {
             set { eingabe = value; }
             get { return eingabe; }
         }
         private void btnCancel_Click(object sender, RoutedEventArgs e) {
             eingabe = "";
             this.Visibility = Visibility.Hidden;
         }
         private void btnOK_Click(object sender, RoutedEventArgs e) {
             eingabe = this.txtEingabe.Text;
             this.Visibility = Visibility.Hidden;
         }
     }
}

Listing 2: Code behind-Modul des Fensters InputBoxImEigenbau

Das Textfeld erfährt noch eine Sonderbehandlung: Die Methode SelectAll markiert den kompletten Inhalt und die Methode Focus verschiebt den Fokus auf dieses Steuerelement.

Um das Ergebnis zu betrachten, benötigen wir jedoch noch eine Methode, die das InputBox-Fenster anzeigt. Diese fügen wir einer neuen Schaltfläche des Fensters MainWindow hinzu. Die Methode lautet wie folgt:

private void btnInputBox_Click(object sender, 
         RoutedEventArgs e) {
     InputBox inputBox = new InputBox("Bezeichnung", 

Dies war die Leseprobe dieses Artikels.
Melden Sie sich an, um auf den vollständigen Artikel zuzugreifen.

Bitte geben Sie die Zeichenfolge in das nachfolgende Textfeld ein

Die mit einem * markierten Felder sind Pflichtfelder.

Ich habe die Datenschutzbestimmungen zur Kenntnis genommen.