ErrorProviderButtonDisabler - Gibt Fehleingaben keine Chance
22. Februar 2009 von Werner Mager · Gelesen: 1843 · heute: 4Eine sehr prakische Komponente in .Net ist der ErrorProvider. Mit ihm kann z.B. in einem Dialog eine interaktive Fehlermeldung angezeigt werden, wenn in einem Feld eine ungültige Eingabe gemacht wurde. Nun ist es naheliegend, den Benutzer zu hindern, einen Dialog mit ungültiger Eingabe zu schließen. Dazu habe ich im Rahmen der Entwicklung des BookInventorisers die Komponente “ErrorProviderButtonDisabler” realisiert.
Die Idee
Die Klasse “ErrorProviderButtonDisabler” erweitert die Klasse “ErrorProvider” und kann folglich auch genauso verwendet werden. Zusätzlich hat sie noch die Eigenschaft “DefaultButton”. Dieser Eigenschaft wird der OK-Button des Dialoges zugewiesen. Sobald nun ein Fehler im ErrorProvider anliegt, wird der OK-Button disabled, so dass der Benutzer den Dialog nicht mit OK verlassen kann. Liegen keine Fehler an, sind folglich alle Felder korrekt gefüllt und der OK-Button wird wieder freigegeben. Natürlich kann der Benutzer den Dialog jederzeit über Cancel verlassen, auch wenn eine ungültige Eingabe vorliegt.
Der Code
Die Realisierung ist sehr einfach, weswegen ich sie hier an einem Stück aufliste:
using System; using System.Windows.Forms; using System.Collections; using System.Drawing; namespace BookInventoriser { /// <summary> /// Behaves like a normal ErrorProvider but in addition controls a Button, which will only be enabled if no Error occures. /// </summary> [ToolboxBitmap(typeof(ErrorProvider))] public class ErrorProviderButtonDisabler: ErrorProvider { private Button acceptButton; public Button AcceptButton { get { return acceptButton; } set { acceptButton = value; } } private Hashtable errors = new Hashtable(); public new void SetError(Control control, string value){ base.SetError(control, value); if (value != "") { errors[control] = value; } else { try { errors.Remove(control); } catch { } } if(AcceptButton!=null){ if (errors.Count > 0) { AcceptButton.Enabled = false; } else { AcceptButton.Enabled = true; } } } } }
