Laden...

Alle Formular Felder leeren

Erstellt von Commander82 vor 9 Monaten Letzter Beitrag vor 9 Monaten 791 Views
C
Commander82 Themenstarter:in
4 Beiträge seit 2022
vor 9 Monaten
Alle Formular Felder leeren

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

M
373 Beiträge seit 2006
vor 9 Monaten

Goalkicker.com // DNC Magazine for .NET Developers // .NET Blogs zum Folgen
Software is like cathedrals: first we build them, then we pray 😉

4.968 Beiträge seit 2008
vor 9 Monaten

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.

A
764 Beiträge seit 2007
vor 9 Monaten

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