![](/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.