Hallo Zusammen,
ich habe mir mal einen kleines Hilfe Tool gebaut.
ich habe nach einer möglichkeit gesuch alle Felder unabhängig von ihrer Art zu Reseten / zu Leeren in einer schleife.
Raus gekommen ist folgendes:
public static void ClearAll(Control ctrl)
{
foreach (Control tmp in ctrl.Controls)
{
if (tmp is Form || tmp is GroupBox)
{
ClearAll(tmp);
}
else if (tmp is TabControl)
{
foreach (TabPage tp in tmp.Controls)
{
ClearAll(tp);
}
}
else if (tmp is TextBox|| tmp is RichTextBox || tmp is MaskedTextBox)
{
tmp.Text = "";
}
else if (tmp is CheckBox)
{
CheckBox check = (CheckBox)tmp;
check.Checked = false;
}
else if (tmp is ComboBox)
{
ComboBox combo = (ComboBox)tmp;
if (combo.Items.Count > 0)
{
combo.SelectedIndex = 0;
}
else
{
combo.SelectedIndex = -1;
combo.Text = null;
}
}
else if (tmp is DateTimePicker)
{
DateTimePicker dtp = (DateTimePicker)tmp;
dtp.Value = DateTime.Now;
}
else if(tmp is DataGridView)
{
DataGridView dgvr = (DataGridView)tmp;
dgvr.Rows.Clear();
}
}
}
Ich habe das ganze in eine Statische Klasse (names "helper") gesetz und rufe dann das ganze so auf
helper.ClearAll(this);
Was haltet Ihr davon?
würde ja gerne es so machen das ich dies "tihs" Rauslasen kann und er das Formular selbst erkennt von dem der befehl kam .
leider bin ich mit meinem Wissen noch nicht so weit!
Lieben Gruß
Commander 82
Um mehrere Controls anzusprechen gibt es hier eine FAQ: https://mycsharp.de/forum/threads/21211/faq-variablennamen-zur-laufzeit-zusammensetzen-dynamisches-erzeugen-von-controls
Goalkicker.com // DNC Magazine for .NET Developers // .NET Blogs zum Folgen
Software is like cathedrals: first we build them, then we pray 😉
Hallo,
auf this
(bzw. allgemein die Referenz auf eine Form
) beim Aufruf zu verzichten, wird nicht gehen solange die Methode statisch ist (aber das ist für eine wiederverwendbare Hilfsmethode auch gut so).
Du könntest aber, da du die Methode selber in eine statische Klasse ausgelagert hast, diese als Erweiterungsmethode erstellen:
public static void ClearAll(this Control ctrl) // beachte das 'this'
{
// ...
}
Und der Aufruf sähe dann z.B. aus der Form-Klasse nur noch so aus:
this.ClearAll();
Und die Zeile
else if (tmp is TextBox|| tmp is RichTextBox || tmp is MaskedTextBox)
kannst du verkürzen zu
else if (tmp is TextBoxBase)
(da dies die Basisklasse ist: TextBoxBase)
Und generell kannst du auf das zusätzliche Casten (je Control-Art) verzichten, indem du direkt beim is
schon einen Variablennamen angibst, z.B.
else if (tmp is CheckBox check)
{
check.Checked = false;
}
s.a. [FAQ] Casten aber richtig: Boxing/Unboxing - () / is / as / Pattern Matching
PS: @M.L.: Das macht der Code ja schon.
Hallo Commander82
Erst mal grundsätzlich: du solltest per DataBinding ein ViewModel mit dem Form verbinden. Ein Clear würdest du dann auf dem ViewModel machen und nicht auf den Controls. Stichworte: MVC ( ~WinForms) / MVVM (~WPF) und ausserdem:
https://mycsharp.de/forum/posts/3758346
Zitat von Commander82
public static void ClearAll(Control ctrl) // man muss heutzutage nicht an Buchstaben sparen: → control { foreach (Control tmp in ctrl.Controls) // mach eine eigene Methode in der du Controls als Liste reingibst // geb deinen Variablen aussagekräftige Namen → control statt tmp { if (tmp is Form || tmp is GroupBox) // switch-Statement, statt if/else-Kaskade { ClearAll(tmp); } else if (tmp is TabControl) { foreach (TabPage tp in tmp.Controls) // ClearAll hier rekursiv verwenden // ...
Hier mal ein Beispiel
internal static class ControlExtentions
{
internal static void ClearAll(this Control.ControlCollection controls) // Das 'this' macht diese Methode zu einer Extension-Methode
{
foreach (Control control in controls)
{
ClearControl(control);
}
}
internal static void ClearControl(this Control control)
{
switch (control)
{
case TabControl c: // Hier habe ich 'c' als Variable genommen, weil der Typ direkt obendrüber steht und man
// direkt erkennt, worum es sich handelt. Wäre das nicht der Fall, dann hätte ich 'tabControl' genommen.
c.Controls.ClearAll();
break;
case TabPage c:
c.Controls.ClearAll(); // rekursiver Aufruf
break;
case TextBox c:
c.Clear(); // Clear-Funktion von Controls verwenden, wenn vorhanden
break;
// ...
case null:
default:
// diese Fälle ignorieren
break;
}
}
}
Ich habe das ganze in eine Statische Klasse (names "helper") gesetz und rufe dann das ganze so auf
helper.ClearAll(this);
Ich bin kein Freund von Helper-Klassen. Klassen sollen eine bestimmte Aufgabe haben und das auch durch ihren Namen ausdrücken. Mehr dazu hier:
https://www.c-sharpcorner.com/UploadFile/damubetha/solid-principles-in-C-Sharp/
Spielt jetzt aber keine Rolle, da wir eh eine Extension-Method daraus machen:
würde ja gerne es so machen das ich dies "tihs" Rauslasen kann und er das Formular selbst erkennt von dem der befehl kam .
Das kannst du per Extention-Method machen:
https://learn.microsoft.com/en-us/dotnet/csharp/programming-guide/classes-and-structs/extension-methods
Das Ganze hier ist als Anregung zu verstehen und keineswegs als absolute Wahrheit. In der Software-Entwicklung kommt es immer auf die spezifische Situation drauf an.
Viele Grüsse
Alf