2010-04-21 7 views
16

Est-ce que quelqu'un sait s'il existe un moyen d'obtenir une liste des contrôles qui ont l'icône ErrorProvider active. c'est à dire. les contrôles qui ont échoué à la validation. J'essaie d'éviter de boucler tous les contrôles dans le formulaire.C# WinForms ErrorProvider Control

J'aimerais afficher un message indiquant le nombre d'erreurs sur le formulaire. Comme mon formulaire contient des onglets, j'essaie de faire comprendre à l'utilisateur que des erreurs peuvent exister sur les onglets inactifs et qu'ils doivent vérifier tous les onglets.

Merci

Barry

Répondre

16

Cela tombe dans la catégorie "comment pouvez-vous pas connaître". C'est votre code qui appelle ErrorProvider.SetError(), vous ne devriez pas avoir de difficulté à garder une trace du nombre d'erreurs qui sont toujours actives. Voici une petite classe d'aide, utilisez sa méthode SetError() pour mettre à jour le ErrorProvider. Sa propriété Count renvoie le nombre d'erreurs actives:

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

Merci Hans. J'ai le sentiment que je devrais faire quelque chose comme ça. En fonction de mes contraintes de temps, je pourrais même créer mon propre fournisseur d'erreur personnalisé pour une utilisation future. Il semble que cette fonctionnalité devrait être disponible avec le contrôle standard - peut-être que c'est juste moi. Merci encore. – codingbadger

+0

Eh bien, c'est. Vous interdisez explicitement d'utiliser GetError() dans votre question. Faites attention à ce que vous demandez. –

+2

Je suppose que je m'attendais un peu trop à la classe 'ErrorProvider'. Un meilleur ErrorProvider serait celui qui vous permet d'interroger des contrôles avec des erreurs, de récupérer un nombre, etc. +1 pour l'exemple, cependant. – IAbstract

0

Ceci est une solution modérément délicate dont vous parlez.

Pour autant que je sache, il n'y a aucun moyen d'y parvenir automatiquement.

Vous devez gérer un indicateur pour chaque contrôle et le définir manuellement chaque fois qu'un fournisseur d'erreurs clignote.

Peut être un Dictionary<TKey, TValue> peut être utilisé pour garder une trace de celui-ci.

0

Vous devez utiliser SetError pour définir l'erreur sur le contrôle en premier lieu, non? Peut-être que vous devriez stocker cette information dans une autre collection en même temps si vous voulez l'avoir à portée de main. Par exemple, vous pouvez ajouter chaque contrôle avec une erreur à un hashset.

+0

Lors de l'utilisation de DataBinding, l'interface IDataErrorInfo est utilisée et vous n'avez rien à gérer. –

0

Assurez la ErrorProvider comme une variable globale plutôt que variable locale

public partial class MainForm 
{ 

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


} 

de

public partial class MainForm 
{ 

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


} 

Cela devrait résoudre votre problème, car vous avez probablement supprimé vos erreurs d'une autre méthode, telle que btnCancel_click. Cela a fonctionné pour moi :)

5

Aujourd'hui, j'ai eu le même problème. Ma solution consiste à étendre le contrôle ErrorProvider.

Voir le code ci-dessous:

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

Vous pouvez utiliser la classe dérivée ci-dessus dans votre formulaire, puis (disons que myErrorProvider est l'instance de classe dans votre formulaire), vous pouvez obtenir tous les contrôles avec des erreurs dans En appelant:

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