Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/282.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从“开始”向每个表单注册加载事件;申请书;_C#_Winforms - Fatal编程技术网

C# 从“开始”向每个表单注册加载事件;申请书;

C# 从“开始”向每个表单注册加载事件;申请书;,c#,winforms,C#,Winforms,有Load事件,我可以执行以下操作 (new Form1()).Load += 但是,我可以从应用程序域向项目中的每个表单注册一个事件吗?是否存在类似“OnFormOpen”的事件?要向项目中的每个表单注册事件,需要创建表单的实例。然后需要为每个表单实例的加载事件分配一个委托 无法将加载事件分配给类型本身,需要该类型的实例才能将处理程序分配给加载事件。可以在构造函数中包含部分代码,以便在每次创建表单实例时注册加载事件 下面是一个包含3个表单类(Form1(启动表单)、Form2、Form3

Load
事件,我可以执行以下操作

 (new Form1()).Load += 

但是,我可以从应用程序域向项目中的每个表单注册一个事件吗?是否存在类似“OnFormOpen”的事件?要向项目中的每个表单注册事件,需要创建表单的实例。然后需要为每个表单实例的加载事件分配一个委托

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

下面是一个包含3个表单类(Form1(启动表单)、Form2、Form3)的项目的代码片段

公共部分类表单1:表单
{
公共表格1()
{
初始化组件();
}
私有无效按钮1\u单击(对象发送者,事件参数e)
{
LoadEventRegister LoadEventRegister=新的LoadEventRegister();
Form[]formInstances=new Form[]{new Form2(),new Form3()};
loadEventRegister.RegisterLoadOnForms(formInstances);
foreach(Form formInstance in formInstance)
{
formInstance.Show();
}
}
}
公共类装入事件寄存器
{
公共无效注册表加载表单(IEnumerable formInstances)
{
foreach(Form formInstance in formInstance)
{
EventInfo EventInfo=formInstance.GetType().GetEvent(“加载”);
类型eventHandlerType=eventInfo.eventHandlerType;
MethodInfo eventHandler=this.GetType().GetMethod(“泛型加载”);
Delegate d=Delegate.CreateDelegate(eventHandlerType,this,eventHandler);
eventInfo.AddEventHandler(formInstance,d);
}
}
public void Generic_Load(对象发送方,事件参数e)
{
MyCustomLoad();
}
私有void MyCustomLoad()
{
//做点什么
}
}

我发现一些非常有趣的东西可以观看表单活动。请参阅,例如:


顺便说一句,您可以通过挂接到此事件来捕获加载到AppDomain中的每个程序集
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
    }
}
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;
    }
}