2012-01-05 78 views
11

我有一個WinForm,我創建它顯示一個按鈕的提示。這是一個自定義的WinForm視圖,因爲消息框對話框不夠。窗體關閉時檢測c#

我有一個後臺工作人員啓動並運行。如果單擊myForm上的按鈕,我也想退出while(aBackgroundWorker.IsBusy)循環。

//MyProgram.cs 

using(CustomForm myForm = new CustomForm()) 
{ 
    myForm.Show(theFormOwner); 
    myForm.Refresh(); 

    while(aBackgroundWorker.IsBusy) 
    { 
     Thread.Sleep(1); 
     Application.DoEvents(); 
    } 
} 

眼下,在CustomFormButton_clicked事件,我有

//CustomForm.cs 

private void theButton_Click(object sender, EventArgs e) 
{ 
    this.Close(); 
} 

我需要更多的代碼添加到CustomForm類,或者我宣佈的位置和初始化爲了形式能夠檢測到關閉?

+0

你想要什麼樣的形式/班通知窗口關閉的? – Decker97 2012-01-05 22:16:59

+1

編寫這段代碼沒有任何意義。大概在這個while循環之後有些東西*。將該代碼移動到該BGW的RunWorkerCompleted事件處理程序。 – 2012-01-05 22:18:30

回答

21

檢測何時形式實際上被關閉,你需要連接的FormClosed事件:

this.FormClosed += new FormClosedEventHandler(Form1_FormClosed); 

    void Form1_FormClosed(object sender, FormClosedEventArgs e) 
    { 
     // Do something 
    } 

或者:

using(CustomForm myForm = new CustomForm()) 
{ 
    myForm.FormClosed += new FormClosedEventHandler(MyForm_FormClosed); 
    ... 
} 

void MyForm_FormClosed(object sender, FormClosedEventArgs e) 
{ 
    // Do something 
} 
+0

救了我的一天..感謝您的美妙回答 – MBH 2015-12-25 12:45:13

+0

其他參考,幫助我瞭解一點:http://www.dreamincode.net/forums/topic/185541-trigger-event-in-another-form/ 'private void button1_Click(object sender,EventArgs e) { Form2 form2 = new Form2(); form2.FormClosed + = new FormClosedEventHandler(form2_FormClosed); form2.Show(); } void form2_FormClosed(object sender,FormClosedEventArgs e) { MessageBox.Show(「Form 2 Closed!」); } ' – 2017-12-19 13:08:26

0

處理窗體關閉時要通知的窗體的FormClosing事件,以便您可以執行任何清理。

+0

表單是我的應用程序中使用的一般表單,所以我不能在CustomForm.cs中說OnFormClosing - 清理MyProgram的這個特定部分。cs – jkh 2012-01-05 22:18:13

+0

如果清理是特定於表單的,您可能需要以所有形式執行此操作。 – Kekoa 2012-01-05 22:19:22

0

一對夫婦的事情...

首先,出現該循環,以防止在對話框打開時執行表單。如果是這種情況,請將.Show(parent)更改爲.ShowDialog(parent)。這也將照顧你的問題的其餘部分。

1

確保您的後臺工作人員支持取消操作,並如其他人指出的那樣使用表單關閉事件處理程序。此代碼應指向正確的方向:

using(CustomForm myForm = new CustomForm()) 
{ 
    myForm.FormClosed += new FormClosedEventHandler(ChildFormClosed); 
    myForm.Show(theFormOwner); 
    myForm.Refresh(); 


    while(aBackgroundWorker.IsBusy) 
    { 
    Thread.Sleep(1); 
    Application.DoEvents(); 
    } 
} 

void ChildFormClosed(object sender, FormClosedEventArgs e) 
{ 
    aBackgroundWorker.CancelAsync(); 
} 
5

您可能會過度使用。要將對話框窗口顯示並等待它退出,然後再將控制權返回給調用窗體,請使用:

mySubForm.ShowDialog();

這將「阻塞」主窗體直到孩子關閉。

+0

這可以保持用戶界面的輕鬆,並簡化閱讀和澄清意圖。沒有氣味。 – 2017-05-03 15:24:37

0

注意this.Hide();是不一樣的this.Close();在實際的對話框你重寫關閉事件