简体   繁体   中英

Control.Focus() bug

I have some problems with Form control focusing.

On form1 I click a button and run the code below:

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();
}

Then, after this CLR I run the event Application_Idle on which I add a method that must focus on the textBox2 control..

private void Application_Idle(object sender, EventArgs e)
{
    form2.textBox2.Focus();
    form2.textBox2.Select();
    form2.textBox2.Focus();

    Application.Idle -= new EventHandler(Application_Idle);
}

But when I click the button on form1, I see Form2 showing, Form3 showing and then Application_Idle method raise, but form2.textBox2 control doesn't get focused...

If I comment out the form3.ShowDialog(); line it's works fine, but how do I focus a form element with another form activation?( form3.ShowDialog() ) ?

Remark added: Problem in also is I have a strict architecture and all I can change is Application_Idle method.

The issue you are having is with modality :

Forms and dialog boxes are either modal or modeless. A modal form or dialog box must be closed or hidden before you can continue working with the rest of the application.

Dialog boxes that display important messages should always be modal. The About dialog box in Visual Studio is an example of a modal dialog box. MessageBox is a modal form you can use.

Modeless forms let you shift the focus between the form and another form without having to close the initial form. The user can continue to work elsewhere in any application while the form is displayed.

When you use ShowDialog , the form that is shown prevents the caller from returning control until the dialog box is closed. If this is not the desired effect, you can use the Show method.

You could focus the textfeld, when the form itself got the focus:

public partial class Form2 : Form
{
    public Form2()
    {
        InitializeComponent();
        this.GotFocus += (s, e) =>
            {
                this.textBox2.Focus();
            };
    }
}

As John Koerner stated, you cannot set focus to Form 2 while Form 3 is open because of modality.

Since you stated that a user input in Form 3 is necessary to proceed, you should change your approach. You can place a listener watch for Form 3's closing. Only then can you set the focus somewhere else

form3.FormClosed += Application_Idle

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM