Domanda

Qualcuno sa se c'è un modo per ottenere un elenco di controlli che hanno l'ErrorProvider icona attiva. vale a dire. tutti i controlli che non hanno superato la convalida. Sto cercando di evitare il loop tutti i controlli in forma.

Mi piacerebbe visualizzare una sorta di messaggio che indica quanti errori ci sono sul modulo. Come il mio modulo contiene schede che sto cercando di rendere evidente per l'utente che possono esistere errori nelle schede inattive e hanno bisogno di controllare tutte le schede.

Grazie

Barry

È stato utile?

Soluzione

Questo rientra nella categoria di "come è possibile non so". E 'il codice che chiama ErrorProvider.SetError (), si dovrebbe avere alcuna difficoltà a tenere traccia di quanti errori sono ancora attivi. Ecco un po 'di classe di supporto, utilizzare il suo metodo SetError () per aggiornare l'ErrorProvider. Le sue 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; } }
}

Altri suggerimenti

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

Si veda 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 derivata sopra nel modulo, e poi (dire che myErrorProvider è l'istanza della classe nel modulo) è possibile ottenere tutti i controlli con errori nel vostro modulo, chiamando il numero:

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

Questa è una soluzione moderatamente difficile che si sta parlando.

Non v'è alcun modo per raggiungere questo automaticamente, per quanto ne so.

È necessario mantenere una bandiera per ogni controllo e impostare manualmente ogni volta un errore del provider si batté le palpebre.

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

Devi usare SetError per impostare l'errore sul controllo, in primo luogo, giusto? Forse si dovrebbe memorizzare le informazioni in un'altra raccolta, allo stesso tempo, se si vuole avere a portata di mano. Ad esempio, si potrebbe aggiungere ogni controllo con un errore ad un hashset.

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 potrebbe essere stato rimuovere gli errori da un altro metodo come btnCancel_click. Questo ha funzionato per me :)

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top