2010-03-15 68 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