我正在创建一个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);
}
以下是我的两个问题:首先,有更清洁的方法吗?其次,为什么必须使用+=
分配事件方法而不只是=
?
答案 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!");
};
}