绑定EventHandler以获取自定义表单控件

时间:2013-03-21 19:53:40

标签: c# asp.net forms reflection

我正在尝试将事件绑定到在自定义Form类中创建的表单元素。关于如何绑定类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");
    }

我收到“绑定到目标方法的错误。”知道如何绑定存在于范围之外的事件的方法吗?

1 个答案:

答案 0 :(得分:1)

没有Delegate.CreateDelegate的重载,它以Type, Type, MethodInfo为参数。因此,您正在调用Delegate.CreateDelegate(Type, Object, MethodInfo) overload,并将typeof(FormLoader)作为第一个参数传递。

由于您传入的MethodInfo未在Type类中定义,因此无法绑定到Type实例。

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