![](/img/trans.png)
[英]Jumping tab order using Control.Focus() when pressing Tab key (.net 3.5)
[英]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.