C# Control.Focus()错误

C# Control.Focus()错误,c#,.net,winforms,controls,C#,.net,Winforms,Controls,我在表单控制聚焦方面有一些问题 在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.

我在表单控制聚焦方面有一些问题

在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之后,我运行事件应用程序\u 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\u Idle
method升起,但是
Form2.textBox2
控件没有聚焦

如果我注释掉
form3.ShowDialog()行它可以正常工作,但是如何通过另一个表单激活来聚焦表单元素?(
form3.ShowDialog()

补充说明:
问题还在于我有一个严格的体系结构,我所能改变的就是应用程序空闲方法。

您遇到的问题是:

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

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

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


使用
ShowDialog
时,显示的表单会阻止调用者返回控件,直到对话框关闭。如果效果不理想,可以使用
Show
方法。

您遇到的问题是:

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

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

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


使用
ShowDialog
时,显示的表单会阻止调用者返回控件,直到对话框关闭。如果这不是期望的效果,您可以使用
Show
方法。

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

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

当表单本身获得焦点时,您可以聚焦textfeld:

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

正如John Koerner所说,你不能将焦点设置为表格2,而表格3是开放的,因为情态

由于您声明必须在表格3中输入用户信息才能继续,因此您应该更改方法。你可以放置一个监听器来监视表单3的结束。只有这样,你才能把焦点放在别的地方

form3.FormClosed += Application_Idle

正如John Koerner所说,你不能将焦点设置为表格2,而表格3是开放的,因为情态

由于您声明必须在表格3中输入用户信息才能继续,因此您应该更改方法。你可以放置一个监听器来监视表单3的结束。只有这样,你才能把焦点放在别的地方

form3.FormClosed += Application_Idle

坦克,但我不能使用'Show'方法,因为在'form3'上有一个通知文本和OK按钮,用户必须单击该按钮才能使用'form2'控件。您的根本问题仍然是模态,因此您需要一种知道事件已触发的方法。另一种选择是在对话框关闭后简单地设置文本焦点。这是绝对正确的。你需要重新考虑你的方法。如果你注意到了中三,你就没有必要马上担心中二。您甚至可以更改工作流,首先加载表单3,让用户填写信息,当他们点击“确定”时,根据表单3的结果创建、显示和填充表单2(并在需要时设置焦点)。我无法处理
form3.Close()
form2.Activate()
events因为验证存在一些架构问题,我可能会在核心验证事件上遇到无限循环问题,这并不重要,只是上面的示例而已。一般来说,我只有
Application\u Idle
事件句柄,必须将
form2.textBox2
集中在这个(Application\u Idle)阶段。在上面的框架1.1代码中是有效的,但在框架2.0(及更高版本)中它已经不起作用了。很好的答案@JohnKoerner,show()替代方案特别有用。Tanks,但我不能使用“show”方法,因为在“form3”上有一个通知文本和OK按钮,用户必须单击该按钮才能使用“form2”控件。您的根本问题仍然是模态,因此,您需要一种知道事件已触发的方法。另一种选择是在对话框关闭后简单地设置文本焦点。这是绝对正确的。你需要重新考虑你的方法。如果你注意到了中三,你就没有必要马上担心中二。您甚至可以更改工作流,首先加载表单3,让用户填写信息,当他们点击“确定”时,根据表单3的结果创建、显示和填充表单2(并在需要时设置焦点)。我无法处理
form3.Close()
form2.Activate()
events因为验证存在一些架构问题,我可能会在核心验证事件上遇到无限循环问题,这并不重要,只是上面的示例而已。一般来说,我只有
Application\u Idle
事件句柄,必须将
form2.textBox2
集中在这个(Application\u Idle)阶段。在Framework1.1中,上面的代码可以工作,但在Framework2.0(及更高版本)中,它已经不工作了。