窗体中的按钮事件处理程序

本文关键字:事件处理 程序 按钮 窗体 | 更新日期: 2023-09-27 18:16:30

我们可以在窗体上创建的按钮是根据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);代表?在这里,我有两个论点。

请帮我澄清一下。

感谢

窗体中的按钮事件处理程序

tt所以,让我们看看什么是事件。

代码,你正在写

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

所以,正如您所看到的,您不能直接访问delegate,只能调用+=和-=,这两个函数被事件类覆盖。此外,您还可以通过重写方法+=和-=来手动管理此机制。你可以这样做:

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

您可以在"CLR via C#"一书中阅读有关事件和委托的更多信息。我在这本书中找到了这一切。

实际上,您正在向事件添加一个处理程序,而不是设置一个处理。您可能希望为一个事件提供更多的处理程序。一个处理程序不应该排除有其他处理程序,因为可能有多个操作需要对可能发生在不同类、不同位置、不同线程和不同条件下的单个事件进行响应说让我成为此活动的订阅者(可能是众多订阅者中的一个(。

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

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

正在为此注册。引发Click事件时要调用的.button1_Click方法。+=添加处理程序,NOT分配处理程序。

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

尊敬的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