【问题标题】:Detect when a form has been closed c#检测表单何时关闭c#
【发布时间】:2012-01-05 22:13:05
【问题描述】:

我创建了一个 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();
    }
}

现在,在CustomFormButton_clicked 事件中,我有

//CustomForm.cs

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

是否需要向 CustomForm 类或声明和初始化表单的位置添加更多代码才能检测到闭包?

【问题讨论】:

  • 你想通知什么窗体/类关闭窗口?
  • 写这段代码没有意义。大概有一些 after 这个while循环。将该代码移至该 BGW 的 RunWorkerCompleted 事件处理程序。

标签: c# winforms events event-handling


【解决方案1】:

要检测表单何时真正关闭,需要挂钩 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
}

【讨论】:

  • 其他帮助我理解的参考资料:dreamincode.net/forums/topic/…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!"); }
【解决方案2】:

你可能会矫枉过正。要显示一个类似于对话框窗口的表单并等待它退出,然后再将控制权返回给调用表单,只需使用:

mySubForm.ShowDialog();

这将“阻塞”主窗体,直到子窗体关闭。

【讨论】:

  • 这样可以保持 UI 简洁,并简化阅读和澄清意图。没有气味。
【解决方案3】:

处理表单的FormClosing 事件以在表单关闭时收到通知,以便您执行任何清理操作。

【讨论】:

  • 表单是整个应用程序中使用的通用表单,所以我不能在 CustomForm.cs OnFormClosing 中说 - 清理 MyProgram.cs 的这个特定部分
  • 如果清理特定于表单,您可能需要在所有表单中执行此操作。
【解决方案4】:

您应该能够挂钩 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

关闭是在关闭之前。 Closed 是在它关闭之后。

【讨论】:

    【解决方案5】:

    几件事...

    首先,似乎存在循环以防止在对话框打开时继续执行表单。如果是这种情况,请将您的 .Show(parent) 更改为 .ShowDialog(parent)。这也将解决您的其余问题。

    【讨论】:

      【解决方案6】:

      确保您的后台工作人员支持取消,并且正如其他人指出的那样,使用表单关闭事件处理程序。此代码应为您指明正确的方向:

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

      【讨论】:

        【解决方案7】:

        请注意,this.Hide(); 与您覆盖已关闭事件的实际对话框中的this.Close(); 不同

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多