InputBox bei C# (C Sharp)
In C# gibt es leider standardmäßig keine InputBox wie in Visual Basic. Dieser Artikel zeigt die Implementierung einer einfachen InputBox.InputBox (Bild: Selbst erstellt)
Die Klasse WindowUtils
Ich habe mir eine einfache Klasse WindowUtils geschrieben, die mehrere statische Methoden enthält. Diese Methoden sollen bestimmte Vorgänge in grafischen Oberflächen vereinfachen, wie z.B. das Anzeigen einer InputBox. Diese Methode möchte ich im Folgenden vorstellen. Im Folgenden sehen Sie erst einmal meine Klasse WindowUtils. Die Methode habe ich nur angedeutet. Sie erläutere ich im nächsten Abschnitt genauer. Beachten Sie die beiden using-Befehle, die für die Ausführung der Methode unbedingt benötigt werden.
using System.Windows.Forms; using System.Drawing; namespace MeinProgramm.utils { class WindowUtils { public static DialogResult InputBox(string title, string promptText, ref string value) { // Hier stehen die Anweisungen. Sie finden sie im naechsten Abschnitt. } } }
Die Methode InputBox
Kommen wir zum eigentlich Herzstück dieses Artikel, der Methode InputBox(). Sie ist eigentlich keine größere Herausforderung, aber es vielleicht einfach zu viel Aufwand, sie selbst zu programmieren. Daher hier ein möglicher Quellcode und ein bisschen Erklärung.
Die Methode erhält drei Parameter:
- title: Der Titel für die Eingabebox
- promtText: Die Eingabeaufforderung
- value: Der Wert, den der Benutzer eingegeben hat
Warum gibt die Methode die Benutzereingabe nicht zurück?
Wir möchten gerne wissen, ob der Anwender die Schaltfläche "Abbrechen" angeklickt hat. Falls ja, muss im Programm entsprechend darauf reagiert werden. Deswegen gibt die Methode ein Objekt vom Typ DialogResult zurück. Dieses gibt an, welche Schaltfläche der Benutzer betätigt hat.
Als erstes legen wir in der Methode die benötigten Steuerlemente an.
public static DialogResult InputBox(string title, string promptText, ref string value) { Form form = new Form(); Label label = new Label(); TextBox textBox = new TextBox(); Button buttonOk = new Button(); Button buttonCancel = new Button(); form.Text = title; label.Text = promptText; textBox.Text = value; buttonOk.Text = "OK"; buttonCancel.Text = "Abbrechen";
Die Schaltflächen müssen wissen, was sie tun sollen, wenn die Benutzer sie anklickt. Dazu weisen wir ihrem Property DialogResult die beiden Konstanten DialogResult.OK und DialogResult.Cancel zu. Somit ist geklärt, welches Ergebnis sie zurückgeben, wenn sie angeklickt werden.
buttonOk.DialogResult = DialogResult.OK; buttonCancel.DialogResult = DialogResult.Cancel;
Als nächstes kümmern wir uns um die Darstellung der Steuerelemente. Zuerst stellen wir deren Größe ein. Mit der Eigenschaft Anchor wird die relative Position der Steuerlemente in dem Formular festgelegt; wir verankern die Elemente im Formular. Damit werden sie automatisch an das Formular angepasst, das wir im Folgenden definieren.
label.SetBounds(9, 20, 372, 13); textBox.SetBounds(12, 36, 372, 20); buttonOk.SetBounds(228, 72, 75, 23); buttonCancel.SetBounds(309, 72, 75, 23); label.AutoSize = true; textBox.Anchor = textBox.Anchor | AnchorStyles.Right; buttonOk.Anchor = AnchorStyles.Bottom | AnchorStyles.Right; buttonCancel.Anchor = AnchorStyles.Bottom | AnchorStyles.Right;
Nun kümmern wir uns um das Formular. Wir legen eine Größe fest, fügen in Zeile 2 die Steuerelemente hinzu und kümmern uns um die Ränder. Damit wir eine Dialogbox erhalten, schalten wir aus, dass das Fenster maximiert oder minimiert werden kann. Denn bei einer Dialogbox ist das nicht erlaubt. Die letzten beiden Zeilen ernennen die beiden Schaltflächen zu den Formularschaltflächen zum Abbrechen und Bestätigen.
form.ClientSize = new Size(396, 107); form.Controls.AddRange(new Control[] { label, textBox, buttonOk, buttonCancel }); form.ClientSize = new Size(Math.Max(300, label.Right + 10), form.ClientSize.Height); form.FormBorderStyle = FormBorderStyle.FixedDialog; form.StartPosition = FormStartPosition.CenterScreen; form.MinimizeBox = false; form.MaximizeBox = false; form.AcceptButton = buttonOk; form.CancelButton = buttonCancel;
Zu guter Letzt zeigen wir das Formular modal an mit form.ShowDialog(). Das bedeutet, das Formular muss erst geschlossen werden, bevor der Anwender weiter mit dem Programm arbeiten kann.Die Rückgabe dieser Methode ist ein Objekt vom Typ DialogResult. Damit bekommen wir also heraus, welche Schaltfläche der Anwender angeklickt hat und somit haben wir auch unsere Rückgabe.
In der Variable value speichern wir den eingegebenen Text. Da die Variable als Referenz übergeben wurde, wird sie in der Methode verändert, die InputBox() aufgerufen hat.
DialogResult dialogResult = form.ShowDialog(); value = textBox.Text; return dialogResult;
Da manchmal keine Eingabeaufforderung benötigt wird, habe ich die Methode noch folgendermaßen überladen:
public static DialogResult InputBox(string title, ref string value) { return InputBox(title, "", ref value); }
Der komplette Code
Im Folgenden sehen Sie den kompletten Quellcode noch einmal als Ganzes:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Windows.Forms; using System.Drawing; namespace MeinProgramm.utils { class WindowUtils { public static override DialogResult InputBox(string title, string promptText, ref string value) { Form form = new Form(); Label label = new Label(); TextBox textBox = new TextBox(); Button buttonOk = new Button(); Button buttonCancel = new Button(); form.Text = title; label.Text = promptText; textBox.Text = value; buttonOk.Text = "OK"; buttonCancel.Text = "Abbrechen"; buttonOk.DialogResult = DialogResult.OK; buttonCancel.DialogResult = DialogResult.Cancel; label.SetBounds(9, 20, 372, 13); textBox.SetBounds(12, 36, 372, 20); buttonOk.SetBounds(228, 72, 75, 23); buttonCancel.SetBounds(309, 72, 75, 23); label.AutoSize = true; textBox.Anchor = textBox.Anchor | AnchorStyles.Right; buttonOk.Anchor = AnchorStyles.Bottom | AnchorStyles.Right; buttonCancel.Anchor = AnchorStyles.Bottom | AnchorStyles.Right; form.ClientSize = new Size(396, 107); form.Controls.AddRange(new Control[] { label, textBox, buttonOk, buttonCancel }); form.ClientSize = new Size(Math.Max(300, label.Right + 10), form.ClientSize.Height); form.FormBorderStyle = FormBorderStyle.FixedDialog; form.StartPosition = FormStartPosition.CenterScreen; form.MinimizeBox = false; form.MaximizeBox = false; form.AcceptButton = buttonOk; form.CancelButton = buttonCancel; DialogResult dialogResult = form.ShowDialog(); value = textBox.Text; return dialogResult; } public static DialogResult InputBox(string title, ref string value) { return InputBox(title, "", ref value); } } }
Der Aufruf
Beim Aufruf müssen wir prüfen, ob der Benutzer die Schaltfläche "Ok" angeklickt hat. Und nur dann darf der eingegebene Wert gespeichert werden. Außerdem müssen Sie beachten, dass Sie den letzten Parameter mit dem Schlüsselwort ref übergeben, damit er in der aufrufenden Methode auch verändert wird. Somit wird keine Kopie angelegt, sondern der Wert wird als Referenz übergeben (Call-by-Reference).
String title = ""; if (WindowUtils.InputBox("Bitte Titel eingeben!", "", ref title) == DialogResult.OK) { txtTitle.Text = title; }
Ich hoffe, dass die Erklärungen verständlich waren. Wenn es noch Fragen gibt, können Sie sie jederzeit in den Kommentaren stellen und ich werde sie dort beantworten.
Bildquelle:
Paul-Georg Meister
(Eigene Homepage erstellen? Das is zu beachten)