有没有办法在应用程序中自动捕获C#中的所有FormClosed事件?

时间:2009-09-18 02:38:08

标签: c#

我想集中所有FormClosed事件的代码处理程序,有没有办法让所有正在关闭的表单自动通知?

3 个答案:

答案 0 :(得分:3)

子类Form并在构造函数中将某些函数与自身的FormClosed事件挂钩?如下所示:

public class MyForm : Form
{
    public MyForm(FormClosedEventHandler handler) : base()
    {
        this.FormClosed += handler;
    }
}

然后只使用MyForm代替Form作为所有表单的基类。

编辑:如果您想在某个地方使用某些静态功能作为所有FormClosed事件的处理程序,那么您当然可以使用:

    public MyForm() : base()
    {
        this.FormClosed += Program.MyFormClosedHandler;
    }

但这有点不好(很难测试,请参阅依赖注入),并且你可以使用构造函数链来实现同样的目的。

答案 1 :(得分:2)

在实例化表单后订阅您的事件处理程序。即使用+ =

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

namespace Craft
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();

            var f = new Form2();            
            f.FormClosing += ClosingMonitorer;
            f.Show();

            var g = new Form3();
            g.FormClosing += ClosingMonitorer;
            g.Show();
        }

        void ClosingMonitorer(object sender, FormClosingEventArgs e)
        {            
            MessageBox.Show((sender as Form).Text + " is closing");
        }



    }
}

[编辑:或者您可以使用扩展方法来简化事件订阅过程]

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

namespace Craft
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();

            var f = new Form2();
            f.Show(ClosingMonitorer);            


            var g = new Form3();
            g.Show(ClosingMonitorer);

        }

        void ClosingMonitorer(object sender, FormClosingEventArgs e)
        {
            MessageBox.Show((sender as Form).Text + " is closing");
        }



    }

    public static class Helper
    {
        public static void Show(this Form f, FormClosingEventHandler feh)
        {
            f.FormClosing += feh;
            f.Show();
        }
    }
}

答案 2 :(得分:-2)

我所知道的并不是一种简单的方法,但是如果你想学习一些新的技术,你可以通过面向方面的编程来实现。