2010-04-21 4 views
16

Wer weiß, ob es eine Möglichkeit gibt, eine Liste der Steuerelemente zu erhalten, die das ErrorProvider-Symbol aktiviert haben. dh. Alle Steuerelemente, die die Validierung nicht bestanden haben. Ich versuche zu vermeiden, alle Steuerelemente in dem Formular zu durchlaufen.C# WinForms ErrorProvider Steuerelement

Ich möchte eine Art Nachricht anzeigen, die angibt, wie viele Fehler im Formular vorhanden sind. Da mein Formular Registerkarten enthält, versuche ich dem Benutzer klar zu machen, dass auf inaktiven Registerkarten Fehler auftreten können und dass alle Registerkarten überprüft werden müssen.

Dank

Barry

Antwort

16

Dies fällt in die Kategorie "Wie können Sie nicht wissen". Es ist Ihr Code, der ErrorProvider.SetError() aufruft, Sie sollten keine Schwierigkeiten haben, zu verfolgen, wie viele Fehler noch aktiv sind. Hier ist eine kleine Hilfsklasse, verwenden Sie die Methode SetError(), um den ErrorProvider zu aktualisieren. Seine Eigenschaft Count gibt die Anzahl der aktiven Fehler:

private class ErrorTracker { 
    private HashSet<Control> mErrors = new HashSet<Control>(); 
    private ErrorProvider mProvider; 

    public ErrorTracker(ErrorProvider provider) { 
    mProvider = provider; 
    } 
    public void SetError(Control ctl, string text) { 
    if (string.IsNullOrEmpty(text)) mErrors.Remove(ctl); 
    else if (!mErrors.Contains(ctl)) mErrors.Add(ctl); 
    mProvider.SetError(ctl, text); 
    } 
    public int Count { get { return mErrors.Count; } } 
} 
+0

Danke Hans. Ich habe das Gefühl, dass ich so etwas tun müsste. Abhängig von meinen Zeitbeschränkungen kann ich sogar meinen eigenen benutzerdefinierten Fehlerprovider für die zukünftige Verwendung erstellen. Es scheint, dass diese Funktionalität mit der Standardsteuerung verfügbar sein sollte - vielleicht bin ich es nur. Danke nochmal. – codingbadger

+0

Nun, ist es. Sie verbieten explizit die Verwendung von GetError() in Ihrer Frage. Sei vorsichtig, wonach du fragst. –

+2

Ich vermute, dass ich etwas zu viel von der 'ErrorProvider'-Klasse erwartet habe. Ein besserer ErrorProvider wäre einer, mit dem Sie nach Steuerelementen mit Fehlern suchen können, eine Zählung abrufen usw. +1 für das Beispiel. – IAbstract

0

Dies ist eine mäßig schwierige Lösung Sie sprechen.

Es gibt keine Möglichkeit, dies zu erreichen, soweit ich weiß.

Sie müssen für jedes Steuerelement ein Flag pflegen und es jedes Mal manuell setzen, wenn ein Fehleranbieter blinkt.

Kann ein Dictionary<TKey, TValue> verwendet werden, um den Überblick zu behalten.

0

Sie müssen SetError verwenden, um den Fehler auf dem Steuerelement an erster Stelle zu setzen, oder? Vielleicht sollten Sie diese Informationen in einer anderen Sammlung zur gleichen Zeit speichern, wenn Sie sie griffbereit haben möchten. Zum Beispiel könnten Sie jedes Steuerelement mit einem Fehler zu einem Hashset hinzufügen.

+0

bei der Verwendung von Datenbindung des IDataErrorInfo-Interface verwendet wird, und Sie haben nichts damit zu tun. –

0

einfach die Errorprovider als globale Variable machen, anstatt lokale Variable

public partial class MainForm 
{ 

    ErrorProvider errorProvider1 = new ErrorProvider(); 
    void Validate_Working() 
    { 
    errorProvider1.SetError(textbox1, "textbox is empty"); 
    errorProvider1.Clear(); 
    } 


} 

von

public partial class MainForm 
{ 

    Void Validate_NotWorking() 
    { 
    ErrorProvider errorProvider1 = new ErrorProvider(); 
    errorProvider1.SetError(textbox1, "textbox is empty"); 
    errorProvider1.Clear(); 
    } 


} 

Dieses Ihr Problem beheben sollte, weil Sie möglicherweise Ihre Fehler von einer anderen Methode wie btnCancel_click entfernt haben. Das funktionierte für mich :)

5

Heute hatte ich das gleiche Problem. Meine Lösung besteht darin, das ErrorProvider-Steuerelement zu erweitern.

Sehen Sie den Code unten:

public class MyErrorProvider : ErrorProvider 
    { 

    public List<Control> GetControls() 
    { 
     return this.GetControls(this.ContainerControl); 
    } 

    public List<Control> GetControls(Control ParentControl) 
    { 
     List<Control> ret = new List<Control>(); 

     if (!string.IsNullOrEmpty(this.GetError(ParentControl))) 
     ret.Add(ParentControl); 

     foreach (Control c in ParentControl.Controls) 
     { 
     List<Control> child = GetControls(c); 
     if (child.Count > 0) 
      ret.AddRange(child); 
     } 

     return ret; 
    } 
    } 

Sie die oben abgeleiteten Klasse in einem Formular verwenden können, und dann (sagen, dass myErrorProvider ist die Klasseninstanz in Ihrem Formular) Sie alle Steuerelemente mit Fehlern bekommen Ihre Form, durch den Aufruf:

List<Control> errorControls = myErrorProvider.GetControls();