在调用其子窗体的隐藏方法后,窗体失去焦点

时间:2009-12-11 13:49:40

标签: c# .net winforms

我的应用程序中有Form1调用另一个窗体 - Form2使用ShowDialog()方法。在一些用户交互之后,Form2调用其Hide()方法。之后我的申请有时会失去焦点。这可能是一些设计错误。

代码提取:

    public class Form1 : Form
    {
      Form2 form2;

      public void SomeMethod()
      {
         if (form2==null) form2 = new Form2();
         DialogResult result = form2.ShowDialog(this);
      }

    }

    public class Form2 : Form
    {
        public Form2()
       {
           this.FormClosing += new FormClosingEventHandler(Form2_FormClosing);
       }

       void Form2_FormClosing(object sender, FormClosingEventArgs e)
       {
            if (e.CloseReason == CloseReason.UserClosing)
            {
                e.Cancel = true;
                Hide();
            }
       }
    }

编辑: 我的代码在线上有错误

 DialogResult result = form2.ShowDialog(this);

DialogResult result = ShowDialog(form2,this);

3 个答案:

答案 0 :(得分:2)

如果隐藏对话框,则Form1仍然无法访问,因为ShowDialog要求您在重新聚焦之前将其关闭。

如果您打算对它执行某些操作,则仅处理Form 2的关闭。否则只需让对话框关闭就没有任何好处来隐藏它。

有关详细信息,请参阅MSDN Form.ShowDialog

代码示例

public class Form1: Form
{
     private Form2: form2;
     private bool doDbQuery;

     public Form1()
     {
         doDbQuery = true;
     }

     public void SomeMethod()
     {
         if (form2 != null)
         {
              form2 = new Form();
         }

         if (doDbQuery)
         {
             // do DB query
             // take a note of the information you retrieve
             doDbQuery = false;
         }

         // pass this information to Form2 for it to display.
         DialogResult result = form2.Execute(...);
     }
}

public class Form2 : Form    
{        
    public Form2()       
    {
    }

    public DialogResult Execute(...)
    {
        // use the execute method to inject the data you require for the form
        return ShowDialog;
    }
}

答案 1 :(得分:1)

private: System::Void form_closing(System::Object^  sender, CancelEventArgs^ e) {
    MessageBox::Show( "Ulosteministeri Katainen" );
    e->Cancel = true;
    form->Hide();
    this->Focus();//this is the parent form
}

答案 2 :(得分:0)

如果你使用一些“懒惰”函数,你可以在关闭表单的末尾使用asynchronous methods(委托回调)。