2017-06-07 2 views
0

Überblick über die Funktion.Iterieren durch Kontrollen, um FehlerProvider zu finden C# WinForm

Ich habe diese SaveDetails Funktion innerhalb eines WinForm, der iteriert durch alle der controls, um zu bestimmen, ob irgendein errorProviders haben im form während der Benutzer Eingabe markiert wurde. Wenn die Funktion returns true, alle meine TextBoxes Werte in meinen privaten Feldern gespeichert werden müssen, und eine messagesagebox anzeigen und das Formular schließen.

// Für etwa 15 TextBoxen, Könnte dies auch durch Schleifen erreicht werden? Da sieht das sehr umständlich aus.

title = cmb_Title.Text; 

Wenn returns false und ein errorProvider hat in der Iteration gefunden wurde, muss es eine Fehlermeldung für den Anwender klar privaten Felder angezeigt werden und der Benutzer Chance geben Details erneut eingeben, jedoch nicht klar area per !!

Ausgabe:

die Schleife durchläuft alles, alle Steuerelemente unabhängig davon, ob es eine errorProvider gefunden. Wie kann ich damit aufhören, nur zu markieren, wenn nur einer gefunden wurde? Diese Funktion befindet sich auch in einem 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

Es macht nie Sinn, mehr als einen ErrorProvider für ein Formular zu verwenden. Eine reicht aus, um Symbole und QuickInfos für alle Steuerelemente bereitzustellen. Sie werden natürlich nie Probleme haben, diesen einen Anbieter zu finden. Wenn Sie ErrorProvider verwenden möchten, um * auch * das gesamte Formular zu validieren, dann [berücksichtigen Sie dies] (https://stackoverflow.com/a/2682478/17034). –

Antwort

0

Sie können es nur TextBox Kontrollen und Linq verwenden verkürzen.

Etwas wie folgt aus:

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"); 

Wenn Sie wollen nur TextBox Kontrollen nicht überprüfen, aber alle Bedienelemente in panel1, können Sie immer noch Linq verwenden Sie den Code zu vereinfachen.

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"); 
Verwandte Themen