我在集中控制表单方面遇到一些问题。
在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方法。
最佳答案
您遇到的是modality的问题:
窗体和对话框是模式的或无模式的。在继续使用应用程序的其余部分之前,必须关闭或隐藏模式窗体或对话框。
显示重要消息的对话框应始终是模式对话框。 Visual Studio中的“关于”对话框是模式对话框的示例。 MessageBox是您可以使用的模式形式。
无模式表单使您可以在表单和其他表单之间切换焦点,而不必关闭初始表单。显示表单时,用户可以继续在任何应用程序中的其他地方工作。
当您使用ShowDialog
时,显示的窗体将阻止调用者返回控制,直到关闭对话框。如果这不是理想的效果,则可以使用Show
方法。