Beispiel-Validierung mit dem ErrorProvider
Frank Dzaebel, erstellt am: 8.10.2005, zuletzt geändert:  11.4.2007
Kategorie: Windows Forms, .NET-Version: 1.1/2.0, [Download]

Der Beispiel-Code zeigt exemplarisch eine mögliche Implementierungs-Strategie für die Validierung mit dem ErrorProvider bei Windows Forms. Die this.Controls (der Form) werden rekursiv durchlaufen und allen TextBox'en dabei eine Validating-Event-Behandlung zugefügt. Diese kann dann allgemein an einer Stelle abgefragt und implementiert werden.

Weiterführende Literatur:
[Validierung von Daten in Steuerelementen in Windows Forms (->Schließen des Formulars und Außerkraftsetzen der Validierung)
[Validierung von Benutzereingaben in Windows Forms
[Extending Windows Forms with a Custom Validation Component Library Part1, Part2, Part3 ]
[Control.Validated-Ereignis]
[Control.CausesValidation-Eigenschaft]
[ContainerControl.Validate-Methode]
[Control.Validating-Ereignis]

using System;
using System.Windows.Forms;
using System.ComponentModel;

namespace MultipleValidation
{
  public partial class Form1 : Form
  {
    public Form1()
    {
      InitializeComponent();
    }

    private void ValidierungZufügen(Control control)
    {
      foreach (Control ctl in control.Controls)
      {
        if (ctl.Controls.Count > 0) ValidierungZufügen(ctl);
        if (ctl is TextBox)
          ((TextBox)ctl).Validating += new CancelEventHandler(AllTextBoxes_Validating);
      }
    }

    /// <summary>returns true, if the control is in error. This means: 
    /// control.property == assertObject sets the ErrorProvider accordingly</summary>
    private bool IsError(Control control, string property, object assertObject, string errorText)
    {
      bool isError;
      if (property == "<Zahl>")
      {
        int result; int.TryParse(control.Text, out result);
        isError = (result == 0);
      }
      else
      {
        object val = control.GetType().GetProperty(property).GetValue(control, null);
        isError = (assertObject == null ? val == assertObject : val.Equals(assertObject));
      }
      if (isError) errorControls.SetError(control, errorText);
      else errorControls.SetError(control, "");
      return isError;
    }

    /// <summary>returns true, if no Control is in Error, else false.
    /// Also the ErrorProvider will be set accordingly.</summary>
    private bool IsAllValid()
    {   
      if (IsError(txbArtikelName, "Text", "", "Bitte Artikelname eingeben!")) return false;
      if (IsError(txbPreisMeter, "Text", "", "Bitte Peis eingeben!")) return false;
      if (IsError(txbArtikelNummer, "<Zahl>", "", "Bitte Artikelnummer (ungleich 0) eingeben!")) return false;
      if (IsError(cmbStoffBreite, "Text", "bitte wählen", "Bitte Stoffbreite auswählen!")) return false;
      if (IsError(cmbMaterial, "Text", "bitte wählen", "Bitte Material auswählen!")) return false;
      if (IsError(cmbWaschanleitung, "Text", "bitte wählen", "Bitte Waschanleitung auswählen!")) return false;
      if (IsError(dateTimePicker, "Value", DateTime.Now, "Bitte ein Datum als heute auswählen!")) return false;
      return true;
    }

    private void AllTextBoxes_Validating(object sender, CancelEventArgs e) 
    { IsAllValid(); 
    }

    private void Form1_Load(object sender, EventArgs e)
    {
      dateTimePicker.Value = DateTime.Now;
      ValidierungZufügen(this);
    }
  }
}