C# Control.Focus()错误
我在表单控制聚焦方面有一些问题 在form1上,我单击一个按钮并运行以下代码: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.
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(及更高版本)中,它已经不工作了。