繁体   English   中英

Control.Focus()错误

[英]Control.Focus() bug

我在集中控制表单方面遇到一些问题。

在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方法。

您遇到的问题是与模态有关

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

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

无模式表单使您可以在表单和其他表单之间切换焦点,而不必关闭初始表单。 显示表单时,用户可以继续在任何应用程序中的其他地方工作。

当您使用ShowDialog ,显示的表单将阻止调用者返回控制,直到关闭对话框。 如果这不是所需的效果,则可以使用Show方法。

当表单本身获得焦点时,您可以将textfeld放在焦点上:

public partial class Form2 : Form
{
    public Form2()
    {
        InitializeComponent();
        this.GotFocus += (s, e) =>
            {
                this.textBox2.Focus();
            };
    }
}

如John Koerner所述,由于形式,您无法在Form 3打开时将焦点设置为Form 2。

由于您说要继续进行表格3中的用户输入,因此您应该更改方法。 您可以放置​​一个监听器以监视Form 3的关闭。 只有这样,您才能将重点放在其他地方

form3.FormClosed += Application_Idle

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM