C# Windows窗体:关闭时执行[进程]

24

当我关闭窗体时,如何使它执行某些操作。

6个回答

36

处理 FormClosed 事件。

为此,请在属性窗口的“事件”选项卡中,双击 FormClosed 事件以添加处理程序。

您可以将代码放在生成的 MyForm_FormClosed 处理程序中。

您也可以通过重写 OnFormClosed 方法来实现;为此,请在代码窗口中键入 override onformcl,然后从 IntelliSense 中选择 OnFormClosed

如果要防止表单关闭,则应处理 FormClosing 事件,并将 e.Cancel 设置为 true


没有“Closed”事件,只有“FormClosed”事件 - 相当不直观。 - hello_earth
2
@hello_earth:在 .Net 1 中有一个“Closed”事件,由于各种问题,在 .Net 2.0 中被替换了。原始的“Closed”事件仍然存在以保持兼容性,但已被隐藏。 - SLaks

16

另外一种选择是覆盖 System.Windows.Forms.Form 的 OnFormClosed() 或 OnFormClosing() 方法。

是否使用该方法取决于问题的上下文,当表单将被多次子类化并且它们都需要执行相同的代码时,这种方法更加实用。

如果正在执行相同操作,则对于一两个实例,事件更为有用。

public class FormClass : Form
{
   protected override void OnFormClosing(FormClosingEventArgs e)
   {
        base.OnFormClosing(e);
        // Code
   } 
}

7
并调用 base.OnFormClosing(e) - SLaks
1
我会自然而然地这样做,并认为它是//代码注释的一部分。但确实,你是正确的,对于经验较少的人来说,可能应该在其中加入。谢谢SLaks。 - Ian

10

WinForms有两个事件可能会对您有用。

第一个是FormClosing事件,在实际关闭窗体之前发生。在此事件中,您仍然可以访问窗体类中的任何控件和变量。您还可以通过设置e.Cancel = true;(其中e是作为第二个参数发送给FormClosingSystem.Windows.Forms.FormClosingEventArgs)来取消窗体关闭。

第二个是FormClosed事件,在窗体关闭后发生。此时,您无法访问窗体拥有的任何控件,但仍可以清理变量(例如关闭托管资源)。


2
将此更新为使用FormClosingFormClosed,因为ClosingClosed已被弃用。 - Powerlord
这是否包括表单上的“所有变量”和控件?我刚试了一下,在我继承自Form类的表单中引用了2个字段,并且它们可以在FormClosed事件中被访问。 - PandaWood
@PandaWood 实际上,你是正确的。目前只有这些控件无法访问。我会在这个答案中修复它。 - Powerlord

4

为您的窗体添加一个事件处理程序,处理 FormClosed 事件。

public class Form1
{

    public Form1()
    {    
        this.FormClosed += MyClosedHandler;
    }

    protected void MyClosedHandler(object sender, EventArgs e)
    {
        // Handle the Event here.
    }
}

2
 public FormName()
 {
      InitializeComponent();
      this.FormClosed += FormName_FormClosed;
 }

private void FormName_FormClosed(object sender, System.Windows.Forms.FormClosedEventArgs e)
{
   //close logic here
}

-3

语法:

   form_name.ActiveForm.Close();

例子:

   {
         Form1.ActiveForm.close();
   }

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