我在Form控件聚焦方面遇到了一些问题。
在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方法。
答案 0 :(得分:4)
您遇到的问题是modality:
表单和对话框是模态的或无模式的。在继续使用应用程序的其余部分之前,必须关闭或隐藏模式窗体或对话框。
显示重要消息的对话框应始终为模态。 Visual Studio中的“关于”对话框是模式对话框的示例。 MessageBox是一种可以使用的模态形式。
无模式表单允许您在表单和另一个表单之间移动焦点,而无需关闭初始表单。在显示表单时,用户可以继续在任何应用程序的其他位置工作。
使用ShowDialog
时,显示的表单会阻止调用者返回控件,直到关闭对话框。如果这不是所需的效果,则可以使用Show
方法。
答案 1 :(得分:0)
当表单本身成为焦点时,您可以关注textfeld:
public partial class Form2 : Form
{
public Form2()
{
InitializeComponent();
this.GotFocus += (s, e) =>
{
this.textBox2.Focus();
};
}
}
答案 2 :(得分:0)
正如John Koerner所说,由于形式,你不能将表格3的焦点设置为表格2。
由于您声明表格3中的用户输入是必要的,您应该改变您的方法。您可以为表单3的结束放置一个监听器监视器。只有这样才能将焦点设置在其他地方
form3.FormClosed += Application_Idle