Entwickler-Ecke

Sonstiges (.NET) - CheckForEmptyFields Methode


sk-io - Mi 30.05.12 14:39
Titel: CheckForEmptyFields Methode
Hallo,

Ich habe in mehreren Apps eine methode die normalerweise CheckForEmptyFields heisst und genau dieses tut - hier ist ein kleiner Auschnitt:


C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
private bool NMRCheckForEmptyFields()
        {
            bool r = true;
            if (comboBox_NMRNames.Text == "")
            {
                comboBox_NMRNames.BackColor = Color.Red;
                r = false;
            }
            else
            {
                comboBox_NMRNames.BackColor = Color.White;
            }

            if (numericUpDown_NMRQuantity.Value == 0)
            {
                numericUpDown_NMRQuantity.ForeColor = Color.Red;
                r = false;
            }
            else
            {
                numericUpDown_NMRQuantity.ForeColor = Color.Black;
            }
            
            if (textBox_NMRDescription.Text == "")
            {
                textBox_NMRDescription.BackColor = Color.Red;
                r = false;
            }
            else
                textBox_NMRDescription.BackColor = Color.White;

            return r;
        }


Sehr linear und langweilig das ganze. Benutze aehnlichere Methoden seit den Win32asm tagen :)

Nun bin ich immer noch sehr gruen hinter den Ohren aber koennte man dies nicht um ein Interface wickeln? Sodass ich CheckForEmptyFields bloss ein Array von textboxes, comboboxes oder aehnlicherem senden kann und die mir dann die Felder Rot oder Weiss pinselt?

Ich bueffele gerade an der Theory fuer Interfaces doch weiss ich nicht wo genau anfangen? Eine eigene Klasse?


Christian S. - Mi 30.05.12 14:46

Ich denke nicht, dass die verschiedenen Komponentenklassen ein Interface implementieren, was die von Dir gewünschte Funktionalität enthält.

Da wirst Du schon ein bisschen manueller vorgehen müssen: Übergebe der Methode ein Component[]-Array. Für jedes Element des Arrays prüfst Du, welchen Typ das hat und castest es dann in den richtigen Typ, um den entsprechenden Vergleich zu machen.


ujr - Mi 30.05.12 15:29

user profile iconsk-io hat folgendes geschrieben Zum zitierten Posting springen:
Ich habe in mehreren Apps eine methode die normalerweise CheckForEmptyFields heisst und genau dieses tut - hier ist ein kleiner Auschnitt


Damit werden immer alle Controls getestet, selbst wenn sie korrekt waren und nicht geändert wurden. Besser ist es, die vorhandenen Mechanismen zur Validierung zu nutzen: User Input Validation in Windows Forms [http://msdn.microsoft.com/en-us/library/ms229603.aspx]


sk-io - Mi 30.05.12 19:23

user profile iconujr hat folgendes geschrieben Zum zitierten Posting springen:
user profile iconsk-io hat folgendes geschrieben Zum zitierten Posting springen:
Ich habe in mehreren Apps eine methode die normalerweise CheckForEmptyFields heisst und genau dieses tut - hier ist ein kleiner Auschnitt


Damit werden immer alle Controls getestet, selbst wenn sie korrekt waren und nicht geändert wurden. Besser ist es, die vorhandenen Mechanismen zur Validierung zu nutzen: User Input Validation in Windows Forms [http://msdn.microsoft.com/en-us/library/ms229603.aspx]


Ich wuerde gerne mal wissen wieviele von uns denn tatsaechlich individuelle Validating events schreiben. :) Bei einem 'normaler' Form (Name, Addresse, usw) waeren dies schon 6+ die bloss checken wurden ob es IsNullOrEmpty waere. Ich sehe ein dass ein ValidateChildren() sehr nuetzlich sein kann, doch ist es fuer Otto NormalCoder ?


sk-io - Mi 30.05.12 19:32

user profile iconChristian S. hat folgendes geschrieben Zum zitierten Posting springen:

Da wirst Du schon ein bisschen manueller vorgehen müssen: Übergebe der Methode ein Component[]-Array. Für jedes Element des Arrays prüfst Du, welchen Typ das hat und castest es dann in den richtigen Typ, um den entsprechenden Vergleich zu machen.


versuchen kann ichs ;)


ujr - Do 31.05.12 09:20

user profile iconsk-io hat folgendes geschrieben Zum zitierten Posting springen:
Bei einem 'normaler' Form (Name, Addresse, usw) waeren dies schon 6+ die bloss checken wurden ob es IsNullOrEmpty waere.


Das lässt sich stark reduzieren, insbesondere, wenn die Prüfmethoden identisch sind.

So könnte man für alle Textboxen die selben Validating/Validated-Ereignisbehandlungen verwenden, für alle NumericUpDown die selben usw. Man kann sogar, da die Methoden immer die selbe Signatur haben, überhaupt für alle Ereignisse die selbe Methode verwenden und überprüft den Typ des Senders.
Schließlich könnte man die Ereignisse auch mit anonymen Methoden oder Lambda-Expressions bearbeiten und diese alle in einer speziellen Methode zuweisen (also auch zentral).