2010-04-21 15 views
16

Qualcuno sa se esiste un modo per ottenere un elenco di controlli con l'icona ErrorProvider attiva. vale a dire. eventuali controlli che non hanno superato la convalida. Sto cercando di evitare il looping di tutti i controlli nel modulo.C# WinForms ErrorProvider Control

Mi piacerebbe visualizzare una sorta di messaggio che indica quanti errori ci sono nel modulo. Dato che il mio modulo contiene schede, sto cercando di rendere evidente all'utente che possono esistere errori nelle schede inattive e che devono controllare tutte le schede.

Grazie

Barry

risposta

16

Questo rientra nella categoria "Come è possibile che lo non risponda allo". È il tuo codice che chiama ErrorProvider.SetError(), non dovresti avere problemi a tenere traccia di quanti errori sono ancora attivi. Ecco una piccola classe helper, usa il suo metodo SetError() per aggiornare ErrorProvider. La sua proprietà Count restituisce il numero di errori attivi:

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

Grazie Hans. Ho la sensazione che avrei dovuto fare qualcosa di simile. A seconda dei miei limiti di tempo, potrei persino creare il mio errorprovider personalizzato per uso futuro. Sembra che questa funzionalità dovrebbe essere disponibile con il controllo standard - forse quello sono solo io. Grazie ancora. – codingbadger

+0

Bene, lo è. Si proibisce esplicitamente di utilizzare GetError() nella domanda. Stai attento a quello che chiedi. –

+2

Suppongo di essermi aspettato un po 'troppo dalla classe 'ErrorProvider'. Un ErrorProvider migliore sarebbe uno che consente di eseguire query per controlli con errori, recuperare un conteggio, ecc. +1 per l'esempio, però. – IAbstract

0

Questa è una soluzione moderatamente difficile si sta parlando.

Non c'è modo di farlo automaticamente, per quanto ne so.

È necessario mantenere un flag per ogni controllo e impostarlo manualmente ogni volta che viene visualizzato un errore provider.

Può essere un Dictionary<TKey, TValue> può essere utilizzato per tenere traccia di esso.

0

È necessario utilizzare SetError per impostare l'errore sul controllo in primo luogo, giusto? Forse dovresti memorizzare queste informazioni in un'altra raccolta allo stesso tempo se vuoi averlo a portata di mano. Ad esempio, è possibile aggiungere ciascun controllo con un errore a un hashset.

+0

Quando si utilizza DataBinding, viene utilizzata l'interfaccia IDataErrorInfo e non si ha nulla a che fare con esso. –

0

Basta fare l'ErrorProvider come una variabile globale piuttosto che variabile locale

public partial class MainForm 
{ 

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


} 

da

public partial class MainForm 
{ 

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


} 

Questo dovrebbe risolvere il problema, perché probabilmente potresti aver rimosso i tuoi errori da un altro metodo come btnCancel_click. Questo ha funzionato per me :)

5

Oggi ho avuto lo stesso problema. La mia soluzione è di estendere il controllo ErrorProvider.

vedere il codice qui sotto:

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; 
    } 
    } 

È possibile utilizzare la classe superiore derivata nel modulo, e poi (diciamo che myErrorProvider è l'istanza della classe nel modulo) è possibile ottenere tutti i controlli con errori di il modulo, chiamando:

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