有Load
事件,我可以做类似
(new Form1()).Load +=
但是,我可以从Application Domain向我项目中的每个表单注册一个事件吗?是否有像“OnFormOpen”这样的事件?
答案 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;
}
}