如何在控件中找到Tab键顺序中的第一个控件?

时间:2017-08-09 08:03:24

标签: c# tabindex tab-ordering

我在Control中编写了一个Extension方法来获取Tab键顺序 First 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();
}

但我认为它不是最好的方式,有人能建议更好的方法来解决这个问题吗?提前谢谢。

1 个答案:

答案 0 :(得分: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()。另外,如果?.Focus()返回FirstOrDefault(),请考虑使用null