2017-08-09 6 views
2

私は以下のようにControlにタブ順序に第1の制御を取得するために拡張メソッドを書く:コントロールのタブ順序で最初のコントロールを見つけるには?

public static void FirstControlFocus(this Control ctl) 
{ 
    ctl.Controls.OfType<Control>().Where(c => c.TabIndex == 0).FirstOrDefault().Focus(); 
} 

問題は時々多分TabOrder==0とは、既存のコントロールはありません(例えば、開発者が削除のために!設計モードでTaborder==0で制御)、これは実行時にエラーにつながります。

私はこのコードでこの問題対処:

public static void FirstControlFocus(this Control ctl) 
{ 
    if (ctl.Controls.OfType<Control>().Any(c => c.TabIndex == 0)) 
     ctl.Controls.OfType<Control>().Where(c => c.TabIndex == 0).FirstOrDefault().Focus(); 
    else if (ctl.Controls.OfType<Control>().Any(c => c.TabIndex == 1)) 
     ctl.Controls.OfType<Control>().Where(c => c.TabIndex == 1).FirstOrDefault().Focus(); 
    else if (ctl.Controls.OfType<Control>().Any(c => c.TabIndex == 2)) 
     ctl.Controls.OfType<Control>().Where(c => c.TabIndex == 2).FirstOrDefault().Focus(); 
    else if (ctl.Controls.OfType<Control>().Any(c => c.TabIndex == 3)) 
     ctl.Controls.OfType<Control>().Where(c => c.TabIndex == 3).FirstOrDefault().Focus(); 
} 

をしかし、私はそれが最善のの方法ではないと思う、誰もがこの問題に対処するためのより良い方法を提案してもらえますか?前もって感謝します。

答えて

2

あなたはMin()を使用することができます。Where()での必要はありません

public static void FirstControlFocus(this Control ctl) 
{ 
    ctl.Controls.OfType<Control>() 
     .FirstOrDefault(c => c.TabIndex == ctl.Controls.OfType<Control>().Min(t => t.TabIndex)) 
     ?.Focus(); 
} 

- あなただけFirstOrDefault()を使用することができます。また、FirstOrDefault()nullを返す場合は、?.Focus()を使用することを検討してください。

+0

'FirstOrDefault()'の後の '?'は何ですか? –

+1

@combo_ci、こちら - https://msdn.microsoft.com/en-us/magazine/dn802602.aspx –

+0

多くのおかげでローマ、私は今日新しいことを学びます:) –

関連する問題