2

我编写了一个扩展方法来获取Tab Order中的第一个控件,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()。另外,考虑使用?.Focus()if FirstOrDefault()return null

于 2017-08-09T08:05:11.253 回答