Validierung von Benutzereingaben in Windows Forms

Wenn Benutzer Daten in Ihre Anwendung eingeben, möchten Sie vielleicht überprüfen, ob die Daten gültig sind, bevor sie von der Anwendung verwendet werden. Beispielsweise kann es erforderlich sein, dass bestimmte Textfelder nicht die Länge 0 haben, dass ein Feld als Telefonnummer oder als ähnlich wohlgeformtes Datenformat formatiert wird oder dass eine Zeichenfolge keine unsicheren Zeichen enthält, die die Sicherheit einer Datenbank beeinträchtigen könnten. Windows Forms bieten mehrere Möglichkeiten, um Eingaben in der Anwendung zu überprüfen.

Validierung mit dem MaskedTextBox-Steuerelement

Wenn Sie Benutzereingaben in einem wohlgeformten Format benötigen, beispielsweise im Telefon- oder Teilenummernformat, lässt sich dies schnell und mit wenig Programmieraufwand realisieren. Sie verwenden dazu das MaskedTextBox-Steuerelement. Eine Maske ist eine Zeichenfolge aus Zeichen in einer Maskingsprache, durch die festgelegt wird, welche Zeichen an einer bestimmten Position im Textfeld eingegeben werden dürfen. Über das Steuerelement werden dem Benutzer eine Reihe von Aufforderungen angezeigt. Wenn der Benutzer eine falsche Eingabe macht, also beispielsweise einen Buchstaben eingibt, während eine Ziffer benötigt wird, wird die Eingabe vom Steuerelement automatisch zurückgewiesen.

Die von MaskedTextBox verwendete Maskingsprache ist sehr flexibel. Sie ermöglicht es Ihnen, obligatorische Zeichen, optionale Zeichen, literale Zeichen wie Bindestriche und Klammen, Währungszeichen und Datumstrennzeichen festzulegen. Das Steuerelement funktioniert auch, wenn es an eine Datenquelle gebunden ist. Das Format-Ereignis für eine Datenbindung kann auch zum Neuformatieren eingehender Daten entsprechend der Maske und das Parse-Ereignis zum Neuformatieren ausgehender Daten entsprechend den Spezifikationen des Datenfeldes verwendet werden.

Weitere Informationen finden Sie unter MaskedTextBox-Steuerelement (Windows Forms).

Ereignisgesteuerte Validierung

Wenn die Validierung vollständig programmgesteuert ablaufen soll oder wenn umfangreiche Validierungen erforderlich sind, sollten Sie die Validierungsereignisse verwenden, die in die meisten Windows Forms-Steuerelemente integriert sind. Jedes Steuerelement, das formfreie Benutzereingaben akzeptiert, verfügt über ein Validating-Ereignis, das eintritt, sobald das Steuerelement eine Datenvalidierung erfordert. In der Validating-Ereignisbehandlungsmethode können Sie Benutzereingaben auf mehrere Weisen überprüfen. Wenn Sie beispielsweise über ein Textfeld verfügen, das eine Postleitzahl enthalten muss, können Sie die Validierung auf folgende Weisen ausführen:

  • Wenn die Postleistzahl einer bestimmten Gruppe von PLZ-Codes angehören muss, können Sie einen Zeichenfolgenvergleich für die Eingabe ausführen, um die vom Benutzer eingegebenen Daten zu überprüfen. Wenn sich die Postleitzahl beispielsweise in der Menge {10001, 10002, 10003} befinden muss, können Sie zur Validierung der Daten einen Zeichenfolgenvergleich verwenden.

  • Wenn die Postleitzahl in einem bestimmten Format vorliegen muss, können Sie zur Validierung der vom Benutzer eingegebenen Daten reguläre Ausdrücke verwenden. Um beispielsweise das Format ##### oder #####-#### zu überprüfen, können Sie den regulären Ausdruck ^(\d{5})(-\d{4})?$ verwenden. Um beispielsweise das Format A#A #A# zu überprüfen, können Sie den regulären Ausdruck [A-Z]\d[A-Z] \d[A-Z]\d verwenden. Weitere Informationen zu regulären Ausdrücken finden Sie unter Reguläre Ausdrücke von .NET Framework und Beispiele für reguläre Ausdrücke.

  • Wenn die Postleitzahl eine in den USA gültige Postleitzahl sein muss, können Sie einen Postleitzahlen-Webdienst aufrufen, um die vom Benutzer eingegebenen Daten zu überprüfen.

Für das Validating-Ereignis wird ein Objekt des Typs CancelEventArgs bereitgestellt. Wenn Sie feststellen, dass die Daten des Steuerelements ungültig sind, können Sie das Validating-Ereignis abbrechen, indem Sie die Cancel-Eigenschaft dieses Objekts auf true festlegen. Wenn Sie die Cancel-Eigenschaft nicht festlegen, geht Windows Forms davon aus, dass die Validierung für dieses Steuerelement erfolgreich war, und das Validated-Ereignis wird ausgelöst.

Ein Codebeispiel, durch das eine E-Mail-Adresse in einem TextBox überprüft wird, finden Sie unter Validating.

Datenbindung und ereignisgesteuerte Validierung

Die Validierung ist sehr hilfreich, wenn Sie Steuerelemente an eine Datenquelle, z. B. eine Datenbanktabelle, gebunden haben. Mithilfe der Validierung können Sie sicherstellen, dass die Daten des Steuerelements das Format aufweisen, das von der Datenquelle benötigt wird und dass keine Sonderzeichen wie Anführungszeichen und umgekehrte Schrägstriche enthalten sind, die sich als unsicher erweisen könnten.

Wenn Sie die Datenbindung verwenden, werden die Daten im Steuerelement während der Ausführung des Validating-Ereignisses mit der Datenquelle synchronisiert. Wenn Sie das Validating-Ereignis abbrechen, werden die Daten nicht mit der Datenquelle synchronisiert.

Wichtig

Wenn Sie über eine benutzerdefinierte Validierung verfügen, die nach dem Validating-Ereignis stattfindet, wirkt sich dies nicht auf die Datenbindung aus. Wenn Sie beispielsweise über Code in einem Validated-Ereignis verfügen, der versucht, die Datenbindung aufzuheben, bleibt die Datenbindung weiterhin bestehen. Um in diesem Fall eine Validierung im Validated-Ereignis auszuführen, ändern Sie die Datenquellen-Aktualisierungsmodus-Eigenschaft des Steuerelements (unter (Databindings)\(Advanced)) von OnValidation in Never und fügen dem Validierungscode Control.DataBindings["<YOURFIELD>"].WriteValue() hinzu.

Implizite und explizite Validierung

Wann werden die Daten eines Steuerelements überprüft? Dies hängt vom Entwickler ab. Sie können entweder die implizite oder explizite Validierung verwenden, je nachdem, welche Anforderungen Sie an Ihre Anwendung stellen.

Implizite Validierung

Bei der impliziten Validierung werden die Daten überprüft, wenn sie vom Benutzer eingegeben werden. Sie können die Daten während der Eingabe in ein Steuerelement überprüfen, indem Sie die Tastatureingaben lesen oder, was häufiger der Fall ist, verfolgen, wann der Benutzer den Eingabefokus von einem Steuerelement zum nächsten verschiebt. Dieser Ansatz ist hilfreich, wenn Sie dem Benutzer während der Arbeit direktes Feedback zu den Daten geben möchten.

Wenn Sie die implizite Validierung für ein Steuerelement verwenden möchten, müssen Sie die AutoValidate-Eigenschaft dieses Steuerelements auf true festlegen. Wenn Sie das Validating-Ereignis abbrechen, richtet sich das Verhalten des Steuerelements nach dem Wert, den Sie AutoValidate zugewiesen haben. Wenn Sie EnablePreventFocusChange zugewiesen haben, bewirkt das Abbrechen des Ereignisses, dass das Validated-Ereignis nicht eintritt. Der Eingabefokus verbleibt beim aktuellen Steuerelement, bis der Benutzer die Daten in eine gültige Eingabe ändert. Wenn Sie EnableAllowFocusChange zugewiesen haben, tritt das Validated-Ereignis beim Abbrechen des Ereignisses nicht ein, der Fokus wird jedoch trotzdem an das nächste Steuerelement übergeben.

Indem Sie Disable zur AutoValidate-Eigenschaft zuweisen, wird die implizite Validierung grundsätzlich verhindert. Um Steuerelemente zu überprüfen, müssen Sie die explizite Validierung verwenden.

Explizite Validierung

Bei der expliziten Validierung werden die Daten zu einem bestimmten Zeitpunkt überprüft. Sie können die Daten in Reaktion auf eine Benutzeraktion überprüfen, z. B. das Klicken auf eine Schaltfläche zum Speichern oder auf einen weiterführenden Link. Wenn die Benutzeraktion eintritt, können Sie die explizite Validierung auf eine der folgenden Weisen auslösen:

  • Rufen Sie Validate auf, um das letzte Steuerelement zu überprüfen, das den Fokus hatte.

  • Rufen Sie ValidateChildren auf, um alle untergeordneten Steuerelemente in einem Formular- oder Containersteuerelement zu überprüfen.

  • Rufen Sie eine benutzerdefinierte Methode auf, um die Daten in den Steuerelementen manuell zu überprüfen.

Standardverhalten für Windows Forms-Steuerelemente bei der impliziten Validierung

Windows Forms-Steuerelemente verfügen jeweils über unterschiedliche Standardwerte für die AutoValidate-Eigenschaft. In der folgenden Tabelle werden die am häufigsten verwendeten Steuerelemente mit ihren Standardwerten aufgeführt.

Steuerelement

Standardverhalten für die Validierung

ContainerControl

Inherit

Form

EnableAllowFocusChange

PropertyGrid

In Visual Studio nicht verfügbar gemachte Eigenschaft

ToolStripContainer

In Visual Studio nicht verfügbar gemachte Eigenschaft

SplitContainer

Inherit

UserControl

EnableAllowFocusChange

Schließen des Formulars und Überschreiben der Validierung

Wenn ein Steuerelement den Fokus behält, weil die enthaltenen Daten ungültig sind, kann das übergeordnete Formular nicht auf eine der üblichen Weisen geschlossen werden:

  • Durch Klicken auf die Schaltfläche Schließen

  • Durch Auswählen von Schließen im Systemmenü

  • Durch programmgesteuertes Aufrufen der Close-Methode

In einigen Fällen soll der Benutzer jedoch möglicherweise das Formular unabhängig davon schließen können, ob die Werte in den Steuerelementen gültig sind. Die Validierung kann überschrieben und ein Formular mit ungültigen Daten geschlossen werden, wenn Sie einen Handler für das Closing-Ereignis des Formulars erstellen. Legen Sie für das Ereignis die Cancel-Eigenschaft auf false fest. Dadurch wird das Formular in jedem Fall geschlossen. Weitere Informationen und ein Beispiel finden Sie unter Form.Closing.

Tipp

Wenn das Schließen des Formulars auf diese Weise erzwungen wird, gehen alle nicht gespeicherten Daten in den Steuerelementen des Formulars verloren. Außerdem wird in modalen Formularen der Inhalt der Steuerelemente beim Schließen nicht überprüft. Sie können die Validierung von Steuerelementen trotzdem verwenden, um den Fokus auf ein Steuerelement zu fixieren, ohne dass Sie das Verhalten beim Schließen des Formulars beachten müssen.

Siehe auch

Referenz

Control.Validating

Form.Closing

System.ComponentModel.CancelEventArgs

Weitere Ressourcen

MaskedTextBox-Steuerelement (Windows Forms)

Beispiele für reguläre Ausdrücke