我创建的WinForm显示带按钮的提示。这是一个自定义的WinForm视图,因为消息框对话框还不够。
我有一个后台工作人员开始运行。如果单击myForm上的按钮,我还想退出while(aBackgroundWorker.IsBusy
)循环。
//MyProgram.cs
using(CustomForm myForm = new CustomForm())
{
myForm.Show(theFormOwner);
myForm.Refresh();
while(aBackgroundWorker.IsBusy)
{
Thread.Sleep(1);
Application.DoEvents();
}
}
目前,在CustomForm
Button_clicked
事件中,我有
//CustomForm.cs
private void theButton_Click(object sender, EventArgs e)
{
this.Close();
}
我是否需要向CustomForm类或我声明和初始化表单的位置添加更多代码以便能够检测到闭包?
答案 0 :(得分:23)
要检测窗体何时实际关闭,您需要挂钩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
}
答案 1 :(得分:5)
你可能会过度杀伤。要显示类似对话框窗口的表单并在将控制权返回到调用表单之前等待它退出,只需使用:
mySubForm.ShowDialog();
这将“阻止”主要表格直到孩子关闭。
答案 2 :(得分:0)
处理表单关闭时要通知的表单的FormClosing事件,以便您可以执行任何清理。
答案 3 :(得分:0)
您应该能够挂钩FormClosing和FormClosed事件。
http://msdn.microsoft.com/en-us/library/system.windows.forms.form.formclosing.aspx http://msdn.microsoft.com/en-us/library/system.windows.forms.form.formclosed.aspx
结束是在它关闭之前。 关闭后关闭。
答案 4 :(得分:0)
有几件事......
首先,似乎循环存在,以防止在对话框打开时执行表单继续进行。如果是这种情况,请将.Show(parent)
更改为.ShowDialog(parent)
。这也将照顾你的其余问题。
答案 5 :(得分:0)
确保您的后台工作者支持取消,并且正如其他人指出的那样使用表单关闭事件处理程序。此代码应指向正确的方向:
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();
}
答案 6 :(得分:0)
请注意this.Hide();
与覆盖已关闭事件的实际对话框中的this.Close();
不同