2009-05-15 10 views
4

Dans mon code, je dois parcourir les contrôles dans un GroupBox et ne traiter le contrôle que s'il s'agit d'un ComboBox. J'utilise le code:Boucler les contrôles

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

Ma question est: au lieu de boucle à travers tous les contrôles et traiter uniquement les zones de liste déroulante est possible d'obtenir uniquement les zones de liste déroulante de la GroupBox? Quelque chose comme ceci:

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

Répondre

8

Puisque vous utilisez C# 2.0, vous n'avez pas vraiment de chance. Vous pourriez écrire une fonction vous-même. En C# 3.0, vous souhaitez simplement faire:

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

C solution # 2.0:

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

que vous souhaitez utiliser comme:

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

+1 pour mentionner la syntaxe OfType, mais présenté « pseudosolution » exige encore une boucle à travers tous les contrôles enfants. Ce qui ne résout pas le problème de base. – Cerebrus

+0

@Cerebrus: Il ne nécessite pas de boucle si vous n'avez rien à faire avec. Si vous voulez juste la collection de ComboBox, vous pouvez simplement faire: Liste list = new Liste (GetControlsOfType (groupBox.Controls)); –

+0

Merci Mehrdad ... cela fonctionne !!! Ne l'appelez pas pseudosolution. C'est la solution. Vous étiez juste en deçà de la clause where. S'il vous plaît modifier la réponse pour l'ajouter: public statique IEnumerable GetControlsOfType (contrôles Control.ControlCollection) où T: Contrôle –

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

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

Cela ne * compilera * pas. La précédence de 'is' est inférieure à'! '. Par conséquent, le compilateur va d'abord essayer d'appliquer '!' À la variable GroupBox qui échoue. Pour plus d'informations: http://stackoverflow.com/questions/811614/c-is-keyword-and-checking-for-not –

+0

oui, vous avez raison avec cela, ma faute devrait être si (! grpbxChild est System.Windows.Forms.Combobox)) –

2

Mehrdad est tout à fait raison, mais votre syntaxe (même si vous utilisez C# 2.0) est trop compliquée.

Je trouve cela d'être plus simple:

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

Incorrect. typeof (c) est toujours 'System.Type', donc' typeof (c) est ComboBox' est toujours false. Vous devriez faire 'c is ComboBox' –

+0

Ahh, c'est vrai! Mon erreur. J'ai édité mon post avec la correction. – Cerebrus

+0

Oui. C'est correct maintenant. Par souci d'exhaustivité, typeof (c) échouera à compiler en C# si 'c' n'est pas un type. Autrement dit, vous ne pouvez pas faire du typeof sur une variable du tout. –

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 
    } 
} 
Questions connexes