2009-05-15 5 views
4

私のコードでは、GroupBox内のコントロールをループして、ComboBoxの場合にのみコントロールを処理する必要があります。私は、コードを使用しています:コントロールをループする

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

私の質問は:グループボックスからのみコンボボックスを取得することが可能であるされて代わりにすべてのコントロールと処理のみコンボボックスをループするの?このようなもの:

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

答えて

8

あなたはC#2.0を使用しているので、あなたは大したことはありません。自分で関数を書くことができます。 C#の3.0ではあなたがちょうどたい:

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

C#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; 
} 

ようにあなたが使用したい:

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

1が、提示「pseudosolutionは」まだすべての子コントロールをループする必要があります。どちらが基本的な問題に対処していません。 – Cerebrus

+0

@Cerebrus:何もする必要がなければループは必要ありません。 ComboBoxのコレクションがほしいのであれば、リスト list = new List (GetControlsOfType (groupBox.Controls)); –

+0

ありがとうMehrdad ...これは動作します!疑似解決法と呼んではいけません。それが解決策です。あなたはwhere句のちょうど足りませんでした。応答を編集して追加してください: public static IEnumerable GetControlsOfType (Control.ControlCollection controls)T:Control –

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

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

これは*コンパイルされません*。 'is'の優先順位は'! 'よりも低くなっています。その結果、コンパイラは最初に失敗したGroupBox変数に '!'を適用しようとします。詳細については:http://stackoverflow.com/questions/811614/c-is-keyword-and-checking-for-not –

+0

はい、あなたはそれで正しいです、私のせい は でなければなりませんif(! grpbxChildはSystem.Windows.Forms.Combobox)) –

2

Mehrdadは全く正しいですが、あなたの構文は(たとえあなたがC#2.0を使っていても)あまりにも複雑です。

私は、これは単純であることがわかりました:OfType構文を言及するため

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

間違っています。 typeof(c)は常に 'System.Type'なので、' typeof(c)ComboBox'は常にfalseです。あなたは 'c ComboBox'を実行する必要があります –

+0

ああ、そうです!私の間違い。私の記事を修正して編集しました。 – Cerebrus

+0

うん。今は正しい。完全性のために、 'c 'が型でないならば、typeof(c)はC#でコンパイルに失敗します。つまり、変数には型を一切持たせることはできません。 –

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 
    } 
} 
関連する問題