[C#] Control per Name suchen

Drucken
( 0 Votes ) 
Hauptkategorie: Programmieren Kategorie: C#
Erstellt am 30.07.2012 Zuletzt aktualisiert am 02.08.2012 Geschrieben von Jonny132
Um ein beliebiges Control nach dessen Namen zu suchen und als Control-Variable zurückzugeben, muss man eine Rekursive Funktion erstellen.

GetControlByName - Funktion:
        public Control GetControlByName(Control container, string name)
        {
                foreach (Control c in container.Controls)
                {
                    if (c.Name == name)
                    {
                        return c;
                    }

                    if (c.HasChildren)
                    {
                        Control control = GetControlByName(c, name);
                        if (control != null)
                            return control;
                    }
            }
            return null;
        }

Die Funktion übernimmt als Parameter ein Container-Control welches durchsucht werden soll (kann auch eine Form sein, da Form von Control erbt) und den Namen des Controls welches gesucht werden soll.

Zuerst wird via foreach-Schleiffe über alle Controls in dem Container-Control iteriert. Stimmt der Name des Controls mit dem gesuchten Namen überein, geben wir das Control zurück. Das heisst das Control wurde gefunden.

Ist das aktuelle Control nicht das gesuchte Control wird überprüft, ob das Control 'Kinder', mittels HasChildren hat.
Trifft diese Abfrage zu, handelt es sich wieder um ein Container-Control und kann somit wieder an die gleiche Funktion übergeben werden.

Wird in diesem rekursiven Aufruf das Control gefunden (das Control ist somit nicht null), wird es zurückgegeben.
Anderenfalls wird in der Schleiffe weitergesucht.

Aufrufbeispiel:
            Control c = GetControlByName(this, "button1");
     

Wie ihr sehen könnt, müsst ihr bei dieser implementation der Funktion das Control jedoch noch Casten um auf die Eigenschaften des spezifischen Controltypes zugreiffen zu können. Deswegen hier noch die gleiche funktion als Generische Methode gelöst.
 
Generische GetControlByName Funktion:
        public T GetControlByName<T>(Control container, string name)
        {
            foreach (Control c in container.Controls)
            {
                if (c.Name == name)
                {
                    return (T)Convert.ChangeType(c,typeof(T));
                }

                if (c.HasChildren)
                {
                    T control = GetControlByName<T>(c, name);
                    if (control != null)
                        return control;
                }
            }
            return default(T);
        }

Aufrufbeispiel:
                Button button = GetControlByName<Button>(this, "button1");

Dieses Tutorial könnte auch interessant für Sie sein:
[C#] Controls per Type suchen

    Veröffentlichen Sie ihre Kommentare ...