2017-06-07 2 views
0

Présentation de la fonction.Parcourir les contrôles pour trouver errorProviders C# WinForm

J'ai cette fonction SaveDetails dans un WinForm, qui le compare à tous les controls, pour déterminer si des errorProviders ont été signalés dans le form lors de la saisie des utilisateurs. Si la fonction returns true, toutes mes valeurs TextBoxes doivent être stockées dans mes champs privés, et afficher une boîte de messagerie et fermer le formulaire.

// Pour environ 15 textBoxes, est-ce que cela peut être réalisé aussi en faisant une boucle? Comme cela semble très lourd.

title = cmb_Title.Text; 

Si returns false et un errorProvider a été trouvé dans l'itération, il a besoin d'afficher un message d'erreur pour l'utilisateur, les champs privés clairs et donner la chance utilisateur de rentrer dans les détails, mais TextBoxes pas clair !!

Problème:

la boucle à travers tout, itère tous les contrôles, peu importe si elle a trouvé un errorProvider. Comment puis-je empêcher cela de signaler juste quand un seul a été trouvé? Cette fonction est également dans un clickEvent.

code

isValid = true; 
       foreach (Control c in panel1.Controls) 
       { 
        if (errorProvider1.GetError(c).Length > 0) 
        { 
         isValid = false; 
         MessageBox.Show("invalid entry, please revisit the form before proceding"); 

        } 
       } 
       if (isValid) 
       { 
        title = cmb_Title.Text; 
        surName = txt_SurName.Text; 
        dateOfBirth = dateTimePicker1.Text.ToString(); 


        MessageBox.Show("Indi Form Saved"); 
        Hide(); 
+1

Cela n'a jamais aucun sens d'utiliser plus d'un ErrorProvider pour un formulaire. Il suffit de fournir des icônes et des info-bulles pour tous les contrôles. Vous n'aurez jamais de difficulté à trouver ce fournisseur bien sûr. Si vous voulez utiliser ErrorProvider pour * également * valider le formulaire entier, alors [considérez ceci] (https://stackoverflow.com/a/2682478/17034). –

Répondre

0

vous pouvez le raccourcir en utilisant seulement TextBox contrôles et LINQ.

Quelque chose comme ceci:

List<TextBox> textBoxes = panel1.Controls.OfType<TextBox>().ToList(); 
if (textBoxes.Any(tb => !string.IsNullOrEmpty(errorProvider1.GetError(tb)))) 
    MessageBox.Show("invalid entry, please revisit the form before proceding"); 

Si vous ne voulez pas vérifier que les contrôles TextBox mais tous les contrôles panel1, vous pouvez toujours utiliser LINQ pour simplifier votre code.

var controlsList = panel1.Controls.Cast<Control>().ToList(); 
if (controlsList.Any(tb => !string.IsNullOrEmpty(errorProvider1.GetError(tb)))) 
    MessageBox.Show("invalid entry, please revisit the form before proceding");