2016-12-12 2 views
0

C#Windowsフォーム内のすべてのComboBoxにSelectedIndexを設定する方法はありますか?すべてのComboBox要素のSelectedIndex

foreach (ComboBox cb in Controls) 
{ 
    cb.SelectedIndex = -1; 
} 

をしかし、動作するようには思えない。

私はこれを試してみました。

+0

問題がControlsコレクションである可能性があります。これは、フォームによって直接親にされるコントロールのコレクションです。実際には、コンボをさらに下に入れ子にすることができます。グループボックスで –

+0

これは、明示的な制御の使用がより保守的/可読的である場合の良い例です。すべてのコンボボックスに手動で設定するか、コンボボックスのカスタムコレクションを作成し、デフォルト値を設定するためにこのコレクションを使用します。 – Fabio

答えて

2
foreach (Control cnl in Controls) 
{ 
    if(cnl is ComboBox) 
    { 
     ComboBox cb = (ComboBox)cnl; 
     cb.SelectedIndex = -1; 
    } 
} 

+0

これはトリッキーな感謝をしました。私はシンプルで簡単な方法でそれが好きです。 – ExpressDude

0

コントロールのすべてのアイテムがコンボボックスであるとは限りません。これを使用 :これは動作するはず

foreach (var control in Controls) 
{ 
    if (control is ComboBox) 
     ((ComboBox)control).SelectedIndex = -1; 
} 
3

短い回答:すべてのコントロールがComboBoxでない場合は、InvalidCastExceptionで失敗します。まず、最も簡単なトリックを考慮することであるだけComboBox

foreach (var cb in Controls.OfType<ComboBox>()) 
    cb.SelectedIndex = -1; 

長いに答える:あなたがコントロールのツリーを持っている場合、これは失敗することに注意してください。あなたはこのように使用されるように)拡張メソッドの子孫を(書きたいことがあります。

可能な実装は、この未検証のものと同様のものである
foreach (var cb in Descendants().OfType<ComboBox>()) 
    cb.SelectedIndex = -1; 

public static IEnumerable<Control> Descendants(this Control control) 
{ 
    yield return control; 

    var descendants = control.Controls.Cast<Control>().SelectMany(x => Descendants(x)); 
    foreach (var descendant in descendants) 
     yield return descendant; 
} 

:おそらく長期的には最良の解決策ではないことに注意してください。それらのコンボボックスを何らかの形でマークするか、データバインドしてUIコントロールを直接操作する代わりに(View)Modelで作業する必要があります。

1

はこのように機能を追加します。

private void SetComboIndex(Control parent) 
{ 
    foreach (Control c in parent.Controls) 
    { 
     if(c is ComboBox) 
     { 
      ComboBox cb = (ComboBox)c; 
      cb.SelectedIndex = -1; 
     } 
     SetComboIndex(c); 
    } 
} 

と形から、このようにそれを呼び出す:

SetComboIndex(this) 
+0

良い助言、ありがとう。 – ExpressDude

関連する問題