2009-12-11 32 views
2

我的Form1在我的應用程序中調用另一個窗體 - Form2使用ShowDialog()方法。在一些用戶交互後,Form2調用它的Hide()方法。之後,我的應用程序有時會失去焦點。這可能是一些設計錯誤。調用其子窗體的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); 
+0

Form2_FormClosing捕捉的意義是什麼? – serhio

+0

我想保持form2對象的生活。但這並不重要。這是解決問題的例子。它可以從另一種方法調用。 – Michal

回答

2

如果隱藏對話框,然後Form1中仍然會由於ShowDialog要求您在關注它之前關閉它,因此無法訪問。

只有處理Form2的關閉,如果你打算用它做些什麼。否則,只要讓對話關閉,隱藏它就沒有好處。

有關更多詳細信息,請參閱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

事實上,我在對話框的form2控件連接到數據庫,它需要一些時間來加載它。這就是我隱藏它的原因。 – Michal

+0

如果在關閉對話框時進行冗長的過程,您應該考慮在BackgroundWorker上執行此操作,以免妨礙用戶界面。 – James

+1

我在打開對話框時做了很長的過程,它總是一樣的東西,所以不需要每次打開對話框時都這樣做。這就是爲什麼我隱藏對話窗體而不僅僅是關閉它的原因。 – Michal

0

,如果你使用一些「懶」的功能,你可以使用asynchronous methods,在什麼關閉您的形式(代表回調)結束。

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 
}