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

How to find the First Control in Tab Order in a Control?

我编写了一个扩展方法来获取 Tab 顺序中的第一个控件,如下所示:

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

但我认为这不是最好的方式,谁能提出更好的方法来处理这个问题?提前致谢。

您可以使用 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()。此外,如果 FirstOrDefault() returns null.

,请考虑使用 ?.Focus()