Laden...

C# - Mehrere Textboxen leeren und prüfen

Erstellt von tristar vor 7 Jahren Letzter Beitrag vor 7 Jahren 6.852 Views
T
tristar Themenstarter:in
98 Beiträge seit 2016
vor 7 Jahren
C# - Mehrere Textboxen leeren und prüfen

Hallo,

in meiner WinForms Anwendung habe ich relative viele Controls, u.a. auch einige TextBoxen.
Nun möchte ich versuchen, diese möglichst gut (=sauberer Code) zu leeren bzw. auf null zu prüfen.

Ich habe unten mal Code angehängt, wie ich es mir etwa vorstelle. Vielleicht könnt ihr mir helfen und sagen, ob dies so "richtig" ist? Danke!


// Zunächst eine List anlegen und die TextBoxen anhängen.
List<TextBox> lstTextBox = new List<TextBox>();
lstTextBox.Add(tbName);
lstTextBox.Add(tbVorname);
lstTextBox.Add(tbStrasse);
// ...



// Prüfen, ob TextBoxen ausgefüllt ist.
foreach (var control in lstTextBox)
{
    var textBox = control as TextBox;
    if (textBox != null && string.IsNullOrEmpty(textBox.Text))
    {
        MessageBox.Show("Bitte füllen Sie alle Felder aus!");
        return;
    }
}

// Textboxen leeren.
//  Hier noch die zusätzliche Frage, ob ich dies auch für andere Controls wie Comboboxen //verwenden kann?
foreach (var control in lstTextBox)
{
       var textBox = control as TextBox;
	textBox.Text = "";
}

3.825 Beiträge seit 2006
vor 7 Jahren

Hallo Tristar,

Du erstellst zuerst eine Liste der Textboxen ? Wozu ?

Du kannst auch direkt die Controls ansprechen :

foreach (var control in this.Controls)
{
    if (control is TextBox) if (((TextBox)control).Text == "") leer = true;
}

Leeren :

foreach (var control in this.Controls)
{
    if (control is TextBox) ((TextBox)control).Text = "";
    if (control is CheckBox) ((CheckBox)control).Checked = false; 
    ...
}

Grüße Bernd

Workshop : Datenbanken mit ADO.NET
Xamarin Mobile App : Finderwille Einsatz App
Unternehmenssoftware : Quasar-3

T
tristar Themenstarter:in
98 Beiträge seit 2016
vor 7 Jahren

Da nicht alle Textboxen geleert werden sollen, habe ich eben die entsprechenden in die Liste gepackt?

F
10.010 Beiträge seit 2004
vor 7 Jahren

Nein, bitte mach das nicht so.

Auch WindowsForms beherrscht DataBinding und das kann man hier genauso gut benutzen.
Alles andere ist Frickeley.

T
tristar Themenstarter:in
98 Beiträge seit 2016
vor 7 Jahren

Okay - aber wie kann ich es dann lösen, dass nur bestimmte Textboxen angesprochen werden??

3.825 Beiträge seit 2006
vor 7 Jahren
tbName.Text = "";
tbVorname.Text = "";
tbStrasse.Text = "";

?

Oder schau Dir Data-Binding an.

Grüße Bernd

Workshop : Datenbanken mit ADO.NET
Xamarin Mobile App : Finderwille Einsatz App
Unternehmenssoftware : Quasar-3

T
tristar Themenstarter:in
98 Beiträge seit 2016
vor 7 Jahren

Ok, ich habe mich vielleicht zu Beginn nicht klar ausgedrückt.
Die Textboxen sollen nach verschiedenen Nutzeraktionen geleert werden.
Verstehe ich es also richtig, dass es dann am besten wäre das Leeren in eine Methode zu legen und diese immer wieder aufzurufen?


void TextBoxenLeeren()
{
   tbName.Text = "";
   tbVorname.Text = "";
   // ...
}


private void btnSpeichern_Click(object sender, EventArgs e)
{
    // ...
    TextBoxenLeeren();
}

16.807 Beiträge seit 2008
vor 7 Jahren

Am besten wäre Data-Binding.
Aber im Rahmen von Basteln wäre natürlich eine zusammenfassende Clear-Methode noch das geringste Übel.

C
2.121 Beiträge seit 2010
vor 7 Jahren

Noch ein paar Anmerkungen zum Code, falls es dich interessiert.

Du holst die TextBox aus einer List<TextBox>. Was da rauskommt ist bereits eine TextBox, das muss man nicht mehr casten. (wenn man meint man müsste völlig grundlos dieses unsinnige var verwenden, fällt man eben drauf rein)

Du prüfst textBox auf null, wenn du nicht null in die Liste steckst kommt auch kein null raus -> der Test ist eigentlich überflüssig.

Eine TextBox enthält nicht null als Text, außer evtl. bei DataBinding. Weiß nicht nicht. Ohne Binding ist auch der Test auf null überflüssig.

Wenns nur bestimmte Felder sind die du so testen willst, halte ich die Vorgehensweise mit der Liste schon für geeignet.

T
tristar Themenstarter:in
98 Beiträge seit 2016
vor 7 Jahren

Danke chilic für deine Anmerkungen.
Hab es nun wie folgt gelöst


  void TextboxLeeren(List<TextBox> lstTextbox)
        {
            foreach (TextBox textBox in lstTextbox)
            {
                textBox.Text = "";
            }
        }

P
66 Beiträge seit 2009
vor 7 Jahren

Haben nicht alle Controls die "Tag"-Eigenschaft? Das könnte man doch nutzen, um die diversen TextBoxen voneinander zu unterscheiden. Damit könnte man auf die zusätzliche List<TextBox> verzichten.

...

3.003 Beiträge seit 2006
vor 7 Jahren

Das wäre in der WinForms-Welt keine unübliche Methode, aber dennoch die schlechteste. Tag ist eine pure Containereigenschaft. Benutzt man sie so, wie du vorschlägst, erhält sie eine Bedeutung, die demjenigen, der dann die Textboxen behandelt, irgendwann nicht mehr klar sein wird. Im Sinn eines langlebigen, verständlichen, wartbaren Codes sollte man auf sowas verzichten. Auf der anderen Seite würde man dann auch, wie hier schon mehrfach erwähnt, DataBinding benutzen.

LaTino

"Furlow, is it always about money?"
"Is there anything else? I mean, how much sex can you have?"
"Don't know. I haven't maxed out yet."
(Furlow & Crichton, Farscape)

P
66 Beiträge seit 2009
vor 7 Jahren

Ja, das stimmt. Habe ich so gerade nicht bedacht. 😃

...

T
tristar Themenstarter:in
98 Beiträge seit 2016
vor 7 Jahren

Leider verstehe ich das mit dem DataBinding noch nicht wirklich. 😦
Ich habe es mal an einem einfachen Beispiel versucht, indem ich eine Klasse Person erstelle und nun den Namen an die TextBox binde.


textBox1.DataBindings.Add("Text", p, "Name", true, DataSourceUpdateMode.OnPropertyChanged);

Es klappt zumindest, dass ich nun Werte ändern kann.
Aber zum Löschen meiner jeweiligen TextBox müsste ich dann doch immer noch

this.textBox1.DataBindings.Clear();

für jede TextBox schreiben?

3.825 Beiträge seit 2006
vor 7 Jahren

Nein. Das löscht das Databinding, aber nicht den Wert in der Textbox. Schau Dir die Doku an.

Grüße Bernd

Workshop : Datenbanken mit ADO.NET
Xamarin Mobile App : Finderwille Einsatz App
Unternehmenssoftware : Quasar-3

F
10.010 Beiträge seit 2004
vor 7 Jahren

Nein.

p.Name="";