检测表单是否已关闭 c#

16

我有一个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类中添加更多的代码,还是在声明和初始化表单的位置添加代码,才能检测到闭包?


你想通知哪个窗口的表单/类关闭? - Decker97
1
编写这段代码没有意义。可能在这个 while 循环之后有一些东西。将该代码移动到该 BGW 的 RunWorkerCompleted 事件处理程序中。 - Hans Passant
7个回答

32

为了检测表单实际关闭的时刻,你需要挂钩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
}

其他帮助我理解的参考: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已关闭!"); } - Dorian Grv

5

你可能有些过头了。如果要像对话框一样显示一个表单,并在返回控件之前等待其关闭,请使用:

mySubForm.ShowDialog();

这将“阻止”主表单,直到子表单关闭。


这样可以保持用户界面的轻盈,简化阅读并澄清意图。没有任何问题。 - Joe Johnston

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();
}

0
请注意,this.Hide();this.Close();在实际对话框中覆盖关闭事件时不同。

0

处理要关闭的窗体的FormClosing事件,以便在窗体关闭时得到通知,从而可以执行任何清理操作。


该表单是我应用程序中通用的表单,因此我无法在CustomForm.cs的OnFormClosing事件中清理MyProgram.cs的特定部分。 - jkh
如果清理特定于表单,则可能需要以所有形式执行此操作。 - Kekoa

0

0

有几件事情...

首先,看起来循环是为了防止在对话框打开时执行程序。如果是这样的话,请将你的.Show(parent)更改为.ShowDialog(parent)。这也会解决你其他的问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接