如何将Button.Click传递给函数?

时间:2010-03-15 13:55:36

标签: .net

我有一个函数可以添加事件处理程序来控制事件。现在我有几个重载将事件添加到不同类型的控件:

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与之关联的任何事件的参数。

有什么建议吗?谢谢!

2 个答案:

答案 0 :(得分: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);

但我不认为实际订阅该活动会更好。

答案 1 :(得分:-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 */
}

如果您有时想要做一个不是“Click”的事件,您可以将表示事件名称的字符串作为第三个参数传递并如此包装:

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 */
}

很糟糕,但它可以工作,可能比你现在的更紧凑。