2

以下のように、タブ オーダーの最初のコントロールを取得する拡張メソッドを記述Controlします。

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();
}

しかし、それは最善の方法ではないと思います。この問題を処理するためのより良い方法を提案できる人はいますか? 前もって感謝します。

4

1 に答える 1

2

使用できますMin()

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

必要はありませんWhere()-あなただけを使用できますFirstOrDefault()。また、 ifが返さ?.Focus()れる場合の使用を検討してください。FirstOrDefault()null

于 2017-08-09T08:05:11.253 に答える