2011-12-02 143 views
2

,我们可以在表单上创建的按钮是写在事件处理方面的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);委托?在这里我有两个论点。

请随本清我。

谢谢

回答

1

ttSo,让我们看到的是什么事件。

代码,你写

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

更多有关事件,并代表你可以阅读的书“通过C#CLR”。我在本书中发现了这一切。

+0

当然,你的第二个问题的答案是:当你做新的System.EventHandler(this.button1_Click); 您不是创建EventHandler(对象发件人,EventArgs e),只是创建与EventHandler(对象发件人,EventArgs e)具有相同参数和返回类型的方法。 – igofed

0

1 /它不能是“=”(等于),因为委托就像一个函数指针 2 /如果你想参数传递给事件点击按钮,你必须让自己的按钮类,并实现点击事件,并有你自己的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   
    } 
} 
1

esentially,您要添加处理程序的情况下,不设置一个处理程序。你可能希望有更多的事件处理程序。一个处理程序不应该排除其他处理程序,因为可能需要执行多个操作,以响应可能发生在不同类别,不同地点,不同线程和不同条件下的单个事件。 + =说让我成为这个事件的订阅者(可能还有一个订阅者)。

1

如果你想有多个方法呼吁Click事件是什么。你在做什么

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

正在注册this.button1_Click方法,当Click事件被引发时被调用。 +=添加处理程序并且不分配处理程序。

0

亲爱Nagaraj Tantri,

对于问题1:如上所说,由于委派可以设置多事件。

问题2:由于culithay说,如果你想通过自定义的参数通过量事件buttion

点击,如果你想使用事件处理程序,并通过对自定义自己的说法

你要自定义您的控制类和自定义自己的事件的说法,

自定义事件参数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