按钮EventHandler的形式

时间:2011-12-02 03:00:51

标签: c# events delegates

我们可以在表单上创建的按钮是根据Form1.Designer.cs中的事件处理程序编写的

this.button1.Click += new System.EventHandler(this.button1_Click);

此处Clickpublic event EventHandler的类型,此EventHandler是委托

public delegate void EventHandler(object sender, EventArgs e);

现在,

为什么不能'='(等于)

this.button1.Click = new System.EventHandler(this.button1_Click);

并且当我传递参数this.button1_Click时,它是如何匹配的  void EventHandler(object sender, EventArgs e);代表?在这里,我有两个论点。

请用此清除我。

谢谢

5 个答案:

答案 0 :(得分:1)

实际上,您正在为事件添加处理程序,而不是设置一个处理程序。您可能希望为事件提供更多处理程序。一个处理程序不应该排除其他处理程序,因为可能有多个操作可能要响应单个事件而发生,这些事件可能发生在不同的类,不同的地方,不同的线程和不同的条件下。 + =表示让我成为此活动的订阅者(可能还有一个订阅者)。

答案 1 :(得分:1)

如果您想要在Click事件上调用多个方法,该怎么办?你正在做什么

this.button1.Click += new System.EventHandler(this.button1_Click);

正在注册this.button1_Click方法,以便在引发Click事件时调用。 +=添加了处理程序而NOT分配处理程序。

答案 2 :(得分:1)

那么,让我们看看是什么事件。

代码,你写的是

public event EventHandler MyEvent;

将编译为

private EventHandler MyEvent = null;

[MethodImp(MethodImplOptions.Synchronized)]
public void add_MyEvent(EventHandler value) {
    MyEvent = (EventHandler)Delegate.Combine(MyEvent, value);
}

[MethodImp(MethodImplOptions.Synchronized)]
public void remove_MyEvent(EventHandler<NewMailEventArgs> value) {
    MyEvent = (EventHandler)Delegate.Remove(MyEvent, value);
}

因此,如您所见,您无法直接访问委托,只能调用+ =和 - =,这会被重写为事件类。 您也可以通过重写方法+ =和 - =来手动管理此机制。 你可以这样做:

public event EventHandler MyEvent
{
   add { //your code for += here }
   remove { //your code for -= here }
}

有关您可以在“CLR via C#”一书中阅读的活动和代表的更多信息。我在本书中找到了所有这些。

答案 3 :(得分:0)

1 /它不能是'='(等于)因为委托就像一个函数指针 2 /如果要将参数传递给事件按钮单击,则必须创建自己的按钮类并实现Click事件并拥有自己的EventArgs

示例代码:

public class MyEventArg
{
    int _param1;
    string _param2;
    //you can add more param
    public MyEventArg(int _param1,string _param2)
    {
        this._param1 = _param1;
        this._param2 = _param2;
    }
}

public delegate void MyButtonClickHandler(object sender, MyEventArg e)
public class MyButton:Control
{
     public event MyButtonClickHandler OnMyClick;
     //You can raise your event here
 protected override void OnClick(EventArgs e)
 {
           MyEventArg e = new MyEventArg(1,"a");//just sample data here
           this.OnMyClick(this,e);
     }
}

包含MyButton类的表单即时

public partial class Form1 : Form
{
    MyButton myButton = new MyButton();
    public Form1()
    {
        InitializeComponent();
        myButton.OnMyClick += new MyButtonClickHandler(this.myButton_OnMyClicked);
    }

    private void myButton_OnMyClicked(object sender, MyEventArg e){
    //your implementation        
    }
}

答案 4 :(得分:0)

亲爱的Nagaraj Tantri,

对于问题1:如上所述,由于代表可以设置多事件。

对于问题2:正如culithay所说,如果你想通过事件禁止传递自定义参数

点击,如果您想使用 EventHandler 并传递cutom自己的参数

您必须自定义控件类和自定义事件参数

自定义事件参数 CustomEventArg 应该继承 EventArg 类。

您可以采用以下示例代码。

// Customs ColorChanged's event parameter.     
public class ColorChangedEventArgs : EventArgs
{
    private Color color;
    public ColorChangedEventArgs(Color c)
    {
        color = c;
    }

    public Color GetColor
    {
        get { return color; }
    }
}


    //Add this method in your custom control
    protected void ibtnTest_Click(object sender, ColorChangedEventArgs e)
    {
        //TODO;
    }

您还可以参考MSDN here