使用+ =运算符将方法绑定到C#中的事件

时间:2011-04-27 21:03:46

标签: c# events

我正在创建一个Windows窗体,我试图手动将一个方法绑定到myButton的click事件,如下所示:

    public Form1()
    {
        InitializeComponent();
        myButton.Click = new EventHandler(ShowMessage("You clicked my button!"));
    }

    private void ShowMessage(string message)
    {
        MessageBox.Show(message);
    }

正如你们中的一些人可能猜到的那样,编译器并不喜欢这样。我不知道为什么,因为我习惯于能够用Javascript做这样的事情:

document.getElementById("myButton").onclick = function(){showMessage("You clicked my button")};
function showMessage(message) {
  alert(message);
}

我糊涂了它,并最终做了一件非常丑陋的事情涉及这样的全局变量:

    string message = "";
    public Form1()
    {
        InitializeComponent();
        message = "You clicked my button!";
        myButton.Click += ShowMessage; 
    }

    private void ShowMessage(object sender, EventArgs e)
    {
        MessageBox.Show(message);
    }

以下是我的两个问题:首先,有更清洁的方法吗?其次,为什么必须使用+=分配事件方法而不只是=

6 个答案:

答案 0 :(得分:6)

必须将事件处理程序添加到+=的事件中,因为事件可能有多个其他委托对您的特定代码段未知。纯粹的任务意味着能够删除其他相关代表,这是你不应该作为事件的客户做的事情。

此外,您可能希望利用匿名委托来完成任何形式的参数绑定。例如:

myButton.Click += delegate(object sender, EventArgs e) {
    MessageBox.Show("You clicked my button!");
};

答案 1 :(得分:6)

您也可以使用lambda。

myButton.Click += (sender, e) => {
    MessageBox.Show("You clicked my button!");
};

答案 2 :(得分:4)

  

以下是我的两个问题:第一,是   有更清洁的方法吗?

是匿名函数,就像在JavaScript(其他语法)中一样

myButton.Click += delegate(object sender, EventArgs e)   
{ 
  MessageBox.Show(message);
};  
  

为什么必须采用事件方法   分配了一个+ =而不只是一个=?

否则,对于同一事件,您只能有1个事件处理程序而不是多个事件处理程序。 + =在编程语言中用了很多东西来添加东西。 =用于将变量设置为值。

答案 3 :(得分:1)

因为可以添加多个处理程序,就像在javascript代码中一样,onclick中只会调用一个函数。

示例:

myButton.Click += ShowMessage;
myButton.Click += LogToFile;

当按钮单击发生时,将调用ShowMessage和LogToFile这两个函数。这就是“+ =”中的“+”试图指示的内容。您正在添加到处理程序,而不是替换它。

至于使它更容易,你会使用匿名lamdas来帮助,但请注意,以后更难分离/删除处理程序(如果这很重要)。

myButton.Click += new EventHandler( (sender,e) => ShowMessage("You clicked my button!") );

答案 4 :(得分:1)

您可以输入myButton.Click += delegate { showmessage("You clicked my button!"); };

答案 5 :(得分:1)

尝试使用此解决方案来解决全局变量的需求,并为您的事件处理程序提供一个可命名的,可重用的方法:

private void ShowMessage(object sender, EventArgs e, string message)
{
    MessageBox.Show(message);
}


public Form1()
{
    InitializeComponent();
    myButton.Click += delegate(object sender, EventArgs e)   
    { 
        ShowMessage(sender,e,"You clicked my button!");
    };  
}