C # WinForms ErrorProvider Control

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

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

Grazie

Barry

Questo rientra nella categoria di “come puoi non sapere”. È il tuo codice che chiama ErrorProvider.SetError (), non dovresti avere problemi a tenere traccia di quanti errori sono ancora attivi. Ecco una piccola class helper, usa il suo metodo SetError () per aggiornare ErrorProvider. La sua proprietà Count restituisce il numero di errori attivi:

private class ErrorTracker { private HashSet mErrors = new HashSet(); 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; } } } 

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

Guarda il codice qui sotto:

  public class MyErrorProvider : ErrorProvider { public List GetControls() { return this.GetControls(this.ContainerControl); } public List GetControls(Control ParentControl) { List ret = new List(); if (!string.IsNullOrEmpty(this.GetError(ParentControl))) ret.Add(ParentControl); foreach (Control c in ParentControl.Controls) { List child = GetControls(c); if (child.Count > 0) ret.AddRange(child); } return ret; } } 

Puoi utilizzare la class derivata sopra nel tuo modulo e poi (diciamo che myErrorProvider è l’istanza della class nel tuo modulo) puoi ottenere tutti i controlli con errori nel tuo modulo, chiamando:

 List errorControls = myErrorProvider.GetControls(); 

Questa è una soluzione moderatamente complicata di cui stai parlando.

Non c’è modo di realizzarlo 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 può essere usato per tenerne traccia.

Devi usare 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, è ansible aggiungere ciascun controllo con un errore a un hashset.

Basta fare il errorprovider come una variabile globale piuttosto che una variabile locale

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

a partire dal

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

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