2009-05-15 1 views
4

In meinem Code muss ich die Steuerelemente in einer GroupBox durchlaufen und das Steuerelement nur verarbeiten, wenn es eine ComboBox ist. Ich bin mit dem Code:Schleife durch Kontrollen

foreach (System.Windows.Forms.Control grpbxChild in this.gpbx.Controls) 
{ 
    if (grpbxChild.GetType().Name.Trim() == "ComboBox") 
    { 
     // Process here 
    } 
} 

Meine Frage ist: Anstelle den Kontrollen durch alle Schleifen und Verarbeitung nur die Combo-Box ist nur möglich ist, die Kombinationsfelder von der GroupBox zu bekommen? So etwas wie dieses:

foreach (System.Windows.Forms.Control grpbxChild in this.gpbx.Controls.GetControlsOfType(ComboBox)) 
{ 
    // Process here 
} 

Antwort

8

Da Sie C# 2.0 verwenden, sind Sie ziemlich viel Glück. Sie könnten eine Funktion selbst schreiben. In C# 3.0, würden Sie gerade tun:

foreach (var control in groupBox.Controls.OfType<ComboBox>()) 
{ 
    // ... 
} 

C# 2.0-Lösung:

public static IEnumerable<T> GetControlsOfType<T>(ControlCollection controls) 
    where T : Control 
{ 
    foreach(Control c in controls) 
     if (c is T) 
      yield return (T)c; 
} 

, die Sie wie verwenden würde:

foreach (ComboBox c in GetControlsOfType<ComboBox>(groupBox.Controls)) 
{ 
    // ... 
} 
+0

+1 für die OfType Syntax zu erwähnen, aber die präsentierten „Pseudolösung“ erfordert noch eine Schleife durch alle untergeordneten Steuerelemente. Was das Grundproblem nicht angeht. – Cerebrus

+0

@Cerebrus: Es erfordert keine Schleife, wenn Sie nichts damit tun müssen. Wenn Sie nur die Auflistung von ComboBoxen möchten, können Sie einfach Folgendes tun: Liste list = new Liste (GetControlsOfType (groupBox.Controls)); –

+0

Danke Mehrdad ... das funktioniert !!! Nenne es nicht Pseudolösung. Es ist die Lösung. Sie waren knapp vor der Where-Klausel. Bitte bearbeiten Sie die Antwort, um es hinzuzufügen: öffentliche statische IEnumerable GetControlsOfType (Control.ControlCollection Kontrollen), wo T: Control –

0
if (!(grpbxChild is System.Windows.Forms.Combobox)) continue; 

// do your processing goes here 
grpbxChild.Text += " is GroupBox child"; 
+1

Dies wird * nicht * kompilieren. Der Vorrang von "ist" ist niedriger als "!". Als Ergebnis versucht der Compiler zuerst '!' Auf die GroupBox-Variable anzuwenden, die fehlschlägt. Für weitere Informationen: http://StackOverflow.com/Questions/811614/c--Schlüsselword-und-checking-for-not –

+0

ja, du hast Recht, meine Fehler sollte sein, wenn (! (grpbxChild ist System.Windows.Forms.Combobox)) –

2

Mehrdad ganz richtig ist, aber Ihre Syntax (auch wenn Sie C# 2.0 verwenden) ist zu kompliziert.

Das finde ich einfacher zu sein:

foreach (Control c in gpBx.Controls) 
{ 
    if (c is ComboBox) 
    { 
    // Do something. 
    } 
} 
+0

Falsch. typeof (c) ist immer 'System.Type', also ist' typeof (c) ComboBox' immer falsch. Sie sollten tun 'c ist ComboBox' –

+0

Ahh, richtig! Mein Fehler. Habe meinen Beitrag mit der Korrektur bearbeitet. – Cerebrus

+0

Ja. Es ist jetzt richtig. Der Vollständigkeit halber wird typeof (c) nicht in C# kompiliert, wenn 'c' kein Typ ist. Das heißt, Sie können typeof überhaupt nicht für eine Variable verwenden. –

0
foreach (System.Windows.Forms.Control grpbxChild in this.gpbx.Controls) 
{ 
    if (grpbxChild is ComboBox) 
    { 
     // Process here 
    } 
} 
0
foreach (Control items in this.Controls.OfType<GroupBox>()) 
{ 
    foreach (ComboBox item in items.Controls.OfType<ComboBox>()) 
    { 
     // your processing goes here 
    } 
}