将加载事件注册到“应用程序”中的每个表单

时间:2010-12-04 06:28:49

标签: c# winforms

Load事件,我可以做类似

的事情
 (new Form1()).Load += 

但是,我可以从Application Domain向我项目中的每个表单注册一个事件吗?是否有像“OnFormOpen”这样的事件?

2 个答案:

答案 0 :(得分:1)

要向项目中的每个表单注册一个事件,都需要创建表单实例。然后,您需要为每个表单实例的Load事件分配一个委托。

无法将Load事件分配给类型本身,需要使用该类型的实例将处理程序分配给Load事件。部分代码可以包含在构造函数中,以便在每次创建表单实例时注册load事件。

这是包含3个表单类(Form1(启动表单),Form2,Form3)的项目的代码片段。

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e)
    {
        LoadEventRegister loadEventRegister = new LoadEventRegister();
        Form[] formInstances = new Form[] {new Form2(), new Form3()};
        loadEventRegister.RegisterLoadOnForms(formInstances);

        foreach (Form formInstance in formInstances)
        {
            formInstance.Show();
        }
    }
}

public class LoadEventRegister
{
    public void RegisterLoadOnForms(IEnumerable<Form> formInstances)
    {
        foreach (Form formInstance in formInstances)
        {
            EventInfo eventInfo = formInstance.GetType().GetEvent("Load");
            Type eventHandlerType = eventInfo.EventHandlerType;

            MethodInfo eventHandler = this.GetType().GetMethod("Generic_Load");

            Delegate d = Delegate.CreateDelegate(eventHandlerType, this, eventHandler);
            eventInfo.AddEventHandler(formInstance, d);
        }
    }

    public void Generic_Load(object sender, EventArgs e)
    {
        MyCustomLoad();
    }

    private void MyCustomLoad()
    {
        // Do something
    }
}

答案 1 :(得分:0)

我发现观看表格活动非常有趣。请参阅CodeProject article,例如:

public class ApplicationEventHandler
{
    MessageFilterImp filter;

    public void Init()
    {
        filter = new MessageFilterImp();
        Application.AddMessageFilter(filter);
    }
}  

internal class MessageFilterImp : IMessageFilter
{
    public bool PreFilterMessage(ref Message m)
    {
        FormCollection forms = Application.OpenForms;
        foreach (Form form in forms)
        {
            Console.WriteLine("---" + System.DateTime.Now);
            Console.WriteLine(form.Name);
        }
        return false;
    }
}