2010-12-05 122 views
4

我一直在處理奇怪的問題。我在一個項目中使用KryptonForm。我有一個表單(比如說form1),我需要在這個表單上點擊一個按鈕來打開另一個表單。下面是代碼:關閉對話框窗體關閉父窗體

void btn_click(object sender, EventArgs e) 
{ 
    Visible = false; 
    ShowInTaskbar = false; 

    var f = new Form2(); 
    f.ShowDialog(); 

    Visible = true; 
    ShowInTaskbar = true; 
} 

的問題是,當窗體2 關閉它關閉Form1中也。我曾嘗試從Form2設置DialogResult = DialogResult.None,但無濟於事。請幫幫我。

我總是使用這種技術,這件事從來沒有發生過。

+0

您是否已經在調試器中逐步瞭解了這個問題,看看究竟發生了什麼?可能還有一些其他代碼正在執行,這裏沒有包含這些代碼。 – Darbio 2010-12-05 12:32:51

+0

如果您註釋掉此方法中的第2行,會發生什麼情況?如果避免使Form1不可見並隱藏其TaskBar按鈕,Form1是否仍然關閉? – Ran 2010-12-05 12:33:02

+0

父窗體(`form1`)實際*關閉*,還是隻留*隱形*? – stakx 2010-12-05 12:47:40

回答

6

是的,這段代碼很麻煩。用戶關閉對話框時出錯。然後,Windows必須找到另一個窗口來重點關注。您的應用程序中沒有任何剩餘內容,您的主窗口不可見。然後選擇另一個應用程序的窗口。例如,好處是,這將成爲Visual Studio中的一個窗口。一個大的。你的主要形式現在消失在它後面。

您需要確保您的主窗口再次可見之前對話框關閉。您可以通過訂閱對話框的FormClosing事件處理程序來完成此操作。例如:

private void button1_Click(object sender, EventArgs e) { 
     using (var dlg = new Form2()) { 
      dlg.StartPosition = FormStartPosition.Manual; 
      dlg.Location = this.Location; 
      dlg.FormClosing += (s, ea) => this.Show(); // <=== Here 
      this.Hide(); 
      if (dlg.ShowDialog() == DialogResult.OK) { 
       // etc... 
      } 
     } 
    } 
0
  • 你有沒有考慮例外?如果Form2引發異常,則不會執行最後一條語句Visible = trueShowInTaskbar = true。當您嘗試這樣會發生什麼:

    ShowInTaskbar = Visible = false; 
    try 
    { 
        using (var f = new Form2()) // (added since Form2 is an IDisposable) 
        { 
         f.ShowDialog(); 
        } 
    } 
    finally // make sure that the following gets executed even when 
    {  // exceptions are thrown during f.ShowDialog(): 
        ShowInTaskbar = Visible = true; 
    } 
    

  • 當您打開另一種形式比Form2這個方法裏面會發生什麼?

    如果問題消失,問題可能不在此方法內,但與Form2

    如果問題仍然存在:您是否確定您在此方法中執行的操作完全相同,而不是您應用相同技術的其他方法?


  • 嘗試刪除第一行,看看問題是否仍然存在。或者以不同的方式提問:您的父母表單是否僅保留隱形或是否真的得到已關閉