为自定义表单控件绑定EventHandler

本文关键字:绑定 EventHandler 控件 表单 自定义 | 更新日期: 2023-09-27 18:05:16

我试图将事件绑定到自定义表单类中创建的表单元素。对于如何绑定存在于类FormLoader (UserControl文件)上的方法,我非常无能为力。例:

 public class FormBuilder 
{
public Control Create(){
//create form controls here... for each control call AddEvent.
}
void AddEvent(object o, string eventname, string methodname)
    {
        EventInfo ei = o.GetType().GetEvent(eventname);
        MethodInfo mi = typeof (FormLoader).GetMethod(methodname, BindingFlags.Public | BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Default);
        Delegate del = Delegate.CreateDelegate(ei.EventHandlerType, typeof (FormLoader), mi);
        ei.AddEventHandler(o, del);
    }}

这是我如何实例化我的表单。

protected override void OnInit(EventArgs e)
    {
        base.OnInit(e);
        Form = new Form();
        Controls.Add(Form.Create());
    }
    public void ProcessEventAction(object sender, EventArgs e)
    {
        System.Diagnostics.Debug.WriteLine(@"Control Internal Hit");
    }

我得到"错误绑定到目标方法。"任何想法我可以绑定的方法,存在于作用域之外的事件?

为自定义表单控件绑定EventHandler

没有以Type, Type, MethodInfo为参数的Delegate.CreateDelegate重载。因此,调用Delegate.CreateDelegate(Type, Object, MethodInfo)过载,传递typeof(FormLoader)作为第一个参数。

由于传入的MethodInfo没有在Type类上定义,因此它不能绑定到Type实例。

您需要传递FormLoader类的实例作为CreateDelegate方法的第二个参数。假设您不想为每个事件使用一个新实例,则需要将实例传递给AddEvent方法。