2012-01-05 65 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();在实际的对话框你重写关闭事件