如何指定表单打开时应该关注哪个控件?

时间:2009-06-16 14:59:39

标签: .net winforms

每当打开表单时,系统会自动为您控制其中一个控件。据我所知,根据Windows标准行为,获得焦点的控件是Tab键顺序中的第一个启用控件。

问题是如何在运行时更改此内容而无需动态重新调整Tab键顺序。例如,某些表单可能希望根据程序逻辑改变最初聚焦的控件,以便将焦点放在最合适的控件中。如果您只是将其他控件集中在OnLoad处理程序中,则默认逻辑仍会执行并重新聚焦默认控件。

如果您使用C / C ++编写并使用原始窗口过程或MFC,则可以从FALSE处理程序和默认聚焦逻辑返回0(WM_INITDIALOG)被跳过了。但是,我在Windows Forms找不到任何方法。我提出的最好的方法是使用BeginInvokeOnLoad完成后设置焦点,如下所示:

protected override void OnLoad( System.EventArgs e )
{
    base.OnLoad( e );
    // ... code ...
    BeginInvoke( new MethodInvoker( () => this.someControl.Focus() ) );
}

必须有一些正确的方法来做到这一点 - 它是什么?

3 个答案:

答案 0 :(得分:13)

在通过Reflector挖掘之后,我发现似乎是“正确”的方法:使用ContainerControl.ActiveControl。这可以从OnLoad(或其他地方;请参阅文档中的限制)完成,并直接告诉框架您想要关注哪个控件。

使用示例:

protected override void OnLoad( System.EventArgs e )
{
    base.OnLoad( e );
    // ... code ...
    this.ActiveControl = this.someControl;
}

这似乎是迄今为止最干净,最简单的解决方案。

答案 1 :(得分:1)

   public void ControlSetFocus( Control^ control )
   {

      // Set focus to the control, if it can receive focus.
      if ( control->CanFocus )
      {
         control->Focus();
      }
   }    

答案 2 :(得分:0)

您是否可以使用Form.ActivatedForm.Shown事件来查看是否在控制焦点的渲染后调用它们而不是使用OnLoad事件?