簡體   English   中英

Control.Focus()錯誤

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM