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 = "";
}
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
Da nicht alle Textboxen geleert werden sollen, habe ich eben die entsprechenden in die Liste gepackt?
Nein, bitte mach das nicht so.
Auch WindowsForms beherrscht DataBinding und das kann man hier genauso gut benutzen.
Alles andere ist Frickeley.
Okay - aber wie kann ich es dann lösen, dass nur bestimmte Textboxen angesprochen werden??
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
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();
}
Am besten wäre Data-Binding.
Aber im Rahmen von Basteln wäre natürlich eine zusammenfassende Clear-Methode noch das geringste Übel.
- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code
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.
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 = "";
}
}
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.
...
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)
Ja, das stimmt. Habe ich so gerade nicht bedacht. 😃
...
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?
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