2010-03-15 70 views
1

我有一個功能,添加事件處理程序來控制事件。現在我有幾個重載的事件添加到不同類型的控件:如何將Button.Click傳遞給函數?

Public Sub AddEventHandler(Button, ButtonEvent) 'adds event handling for Button.Click 
public Sub AddEventHandler(LinkButton, ButtonEvent)'adds event handling for LinkButton.Click 

的問題是我想編寫一個函數就是喜歡更強勁:

Public sub AddEventHandler(Control, EventToHandle, ControlEvent) 

其中

EventToHandle是表示Button.Click或Button與其關聯的任何事件的參數。

任何建議傢伙?謝謝!

回答

1

你仍然可以做這樣的事情:

private void Subscribe<TControl>(TControl control, Action<TControl, EventHandler> subscriber, EventHandler handler) 
{ 
    subscriber.Invoke(control, handler); 
} 

而且使用:

Subscribe(this, (control, handler) => control.Load += handler, LoadHandler); 

但我不認爲這是更好然後實際訂閱的事件。

+0

+爲最後一行。看起來像這些好主意之一,直到你瞭解細節。這隻會混淆其他需要查看代碼的程序員。 – Greg 2010-03-15 15:09:50

-1

正確的方法可能是使用反射完成的。然而,更簡單的方法是做這樣的事情。

(代碼是在C#中,但轉換是相當瑣碎。)

private void AddEventHandler(Control c, Event e){ 
    if(c is LinkButton){ 
     ((LinkButton)c).Click += e; 
    } 
    else if(c is Button){ 
     ((Button)c).Click += e; 
    } 
    /* etc */ 
} 

如果你有時想要的事件不是「點擊」,你可以通過表示事件名稱作爲一個字符串第三個參數,幷包裝它:

if(what_event == "Click"){ 
    if(c is LinkButton){ 
     ((LinkButton)c).Click += e; 
    } 
    /* etc */ 
} 
else if(what_event == "SelectedIndexChanged"){ 
    if(c is DropDownList){ 
     ((DropDownList)c).SelectedIndexChanged += e; 
    } 
    /* etc */ 
} 

吮吸,但它的工作原理,可能會比現在更緊湊。

+0

這不是我想要去的方式......每當我要處理新的事件或控制時,我必須添加代碼... – Achilles 2010-03-15 14:11:37