2013-03-21 69 views
0

我試圖將一個事件綁定到在自定義窗體類中創建的窗體元素。我對於如何綁定存在於類FormLoader(一個UserControl文件)上的方法非常無能。 例如:爲自定義窗體控件綁定EventHandler

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

沒有的Delegate.CreateDelegate超負荷這需要Type, Type, MethodInfo作爲它的參數。因此,你打電話Delegate.CreateDelegate(Type, Object, MethodInfo) overload,通過typeof(FormLoader)作爲第一個參數。

由於您傳遞的MethodInfo沒有在Type類中定義,因此它不能綁定到Type實例。

你需要通過你的FormLoader類的實例爲CreateDelegate方法的第二個參數。假設您不想爲每個事件使用新實例,則需要將實例傳遞給AddEvent方法。

+0

謝謝!不幸的是我仍然得到「錯誤綁定到目標方法」。 – xoail 2013-03-21 20:18:12

+1

@xoail:抱歉,沒有注意到處理程序不在'o'對象上。你需要一個'FormLoader'的實例來構建委託。 – 2013-03-21 20:21:18

+0

啊..明白了..謝謝! – xoail 2013-03-21 20:55:26