2

我在表单控件聚焦方面遇到了一些问题。

在 form1 上,我单击一个按钮并运行以下代码:

private void btnTest_Click(object sender, System.EventArgs e)
{
    form2 = new Form2();

    Application.Idle += new EventHandler(Application_Idle);

    form2.Show();
    form2.Activate();
    form2.textBox1.Focus();

    Form3 form3 = new Form3();
    form3.ShowDialog();
}

然后,在此 CLR 之后,我运行事件 Application_Idle,我在该事件上添加了一个必须关注 textBox2 控件的方法。

private void Application_Idle(object sender, EventArgs e)
{
    form2.textBox2.Focus();
    form2.textBox2.Select();
    form2.textBox2.Focus();

    Application.Idle -= new EventHandler(Application_Idle);
}

但是当我单击 form1 上的按钮时,我看到 Form2 显示,Form3 显示然后Application_Idle方法引发,但form2.textBox2控制没有得到关注......

如果我注释掉该form3.ShowDialog();行,它可以正常工作,但是如何将一个表单元素与另一个表单激活集中在一起?(form3.ShowDialog())?

备注补充:问题也是我有一个严格的架构,我只能改变 Application_Idle 方法。

4

3 回答 3

4

您遇到的问题与方式有关:

窗体和对话框要么是模式的,要么是无模式的。在继续使用应用程序的其余部分之前,必须关闭或隐藏模式窗体或对话框。

显示重要消息的对话框应该始终是模态的。Visual Studio 中的“关于”对话框是模式对话框的一个示例。MessageBox 是您可以使用的模态表单。

无模式表单允许您在表单和另一个表单之间转移焦点,而无需关闭初始表单。显示表单时,用户可以继续在任何应用程序的其他位置工作。

当您使用ShowDialog时,显示的表单会阻止调用方返回控制权,直到对话框关闭。如果这不是您想要的效果,您可以使用该Show方法。

于 2013-01-11T15:55:59.137 回答
0

当表单本身获得焦点时,您可以关注文本字段:

public partial class Form2 : Form
{
    public Form2()
    {
        InitializeComponent();
        this.GotFocus += (s, e) =>
            {
                this.textBox2.Focus();
            };
    }
}
于 2013-01-11T16:09:20.787 回答
0

正如 John Koerner 所说,由于模式的原因,您不能在 Form 3 打开时将焦点设置到 Form 2。

由于您声明必须在表格 3 中输入用户信息才能继续,您应该改变您的方法。您可以为 Form 3 的关闭放置一个监听器。只有这样你才能把焦点放在别的地方

form3.FormClosed += Application_Idle
于 2013-01-11T16:40:24.040 回答