在 datagridview 选定的索引更改后将焦点设置为控件

Set focus to control after datagridview selected index change

这个问题我纠结了很久。

我在标签页中有一个用户控件,其中包含:

  1. 数据网格视图
  2. 带有标签、文本框和按钮控件的表格布局,这些控件是根据在数据网格视图中选择的行设置的

现在要注意的是,焦点还必须更改为表格布局中的控件: 如果所选项目具有状态 'foo' ,则控件 'foobar' 必须具有焦点,但如果所选项目具有状态 'foofoo',则控件 'foofoobar' 必须具有焦点。

我使用 SelectionChanged 事件来处理这个问题。

这一切正常,如果我手动单击所选项目。 最初加载控件并选择第一行时,焦点设置不正确。

我的猜测是,这与控件 class 的 taborder setter 有关,它覆盖了我的焦点,但我无法弄清楚哪个事件触发了 taborder setter。

我试过了:

  1. 覆盖 OnLoad 和 OnLayout 并调用与在 SelectionChanged 事件中调用的代码相同的代码
  2. 覆盖 OnLoad 和 OnLayout 并首先设置第 2 行,然后设置第 1 行以触发 SelectionChanged 事件

但是没有任何效果。

欢迎提出任何想法。

private void ResultGridView_SelectionChanged(object sender, EventArgs e) {
        SelectInput();
}

private void SetInputFocus() {
    if (isValid) {
        foo.Focus();
    } 
   else {
        foofoo.Focus();
    }

像在 SelectionChanged 事件中一样在 YourTabControl_Layout 事件中设置焦点。

您还可以将焦点最初设置在任何控件上,甚至在带有 Form1_Load 事件的标签页和表格布局上。

    private void Form1_Load(object sender, EventArgs e)
    {
        ActiveControl = SomeControl;
    }

    private void YourTabControl_Layout(object sender, LayoutEventArgs e)
    {
        if (YourTabControl.SelectedIndex == 0)
            SomeControl.Focus();
    }