zurzeit habe ich etwas Schwierigkeiten mit der Validierung von Steuerelementen und dem Verständnis über die .CausesValidation-Eigenschaft in der System.Windows.Forms.Control-Klasse.
Meine Erwartung war, dass ich über die Control.CausesValidation-Eigenschaft bestimmen kann, ob dieses Steuerelement beim Validieren (z.B. beim Verlassen des Steuerelements oder beim Aufruf der "Validate"-Methode im UserControl/in der Form) berücksichtigt werden soll oder nicht. Nach vielen Recherchen musste ich feststellen, dass die .CausesValidation-Eigenschaft sich anscheinend nicht auf das Auslösen von Validierungs-Ereignissen auf dem eigenen Control bezieht, sondern nur auf die Valdierung von anderen Controls.
In meinem Fall habe ich eine Maske, bei der ich eine TextBox (TextBox-1) immer validieren möchte und eine andere TextBox (TextBox-2) nur dann, wenn ein bestimmter Button gedrückt wurde. TextBox-1 enthält einen Schlüsselwert für das dahinter liegende Objekt (über Verwendung von DataBinding) und über TextBox-2 kann zusammen mit einem "Hinzufügen"-Button ein Wert in eine Auflistung innerhalb des Objektes eingetragen werden.
Wenn ich .CausesValidation bei der TextBox-2 auf "False" stelle wird TextBox-1 nicht validiert, wenn ich z.B. mit TAB von TextBox-1 nach TextBox-2 springe.
Wie stelle ich also sicher, dass die TextBox-1 immer validiert wird und die TextBox-2 nur beim Klick auf "Hinzufügen"?
(Zur Validierung verwende ich die EnterpriseLibrary. Damit sollte ein benutzerdefiniertes Behandeln des Validating-Erreignisses nach Möglichkeit vermieden werden, weil vom ValidationProvider dieses Ereignis bereits behandelt wird.)
Wie man erkennen kann habe ich die TextBox-2 in ein eigenes UserControl gepackt (mit dem Hinzufügen-Button).
In UserControlA habe ich die OnValidating- und OnValidated-Methoden überschrieben. In OnValidating setze deaktiviere ich den ValidationProviderB (ein zweiter ValidationProvider) in UserControlB. Und in OnValidated aktiviere ich den ValidationProviderB in UserControlB wieder.
Beim Klick auf Hinzufügen wird jetzt nur innerhalb von UserControlB validiert (Korrekt!). Und die Validierung von UserControlA (ohne die TextBox-2 zu validieren) klappt auch.
Leider ist mir keine bessere Lösung eingefallen. Über weitere Äußerungen dazu würde ich mich trotzdem freuen.