C# 使用+;将方法绑定到C中的事件操作人员
我正在制作一个windows窗体,并试图手动将一个方法绑定到myButton的click事件,如下所示:C# 使用+;将方法绑定到C中的事件操作人员,c#,events,C#,Events,我正在制作一个windows窗体,并试图手动将一个方法绑定到myButton的click事件,如下所示: public Form1() { InitializeComponent(); myButton.Click = new EventHandler(ShowMessage("You clicked my button!")); } private void ShowMessage(string message) {
public Form1()
{
InitializeComponent();
myButton.Click = new EventHandler(ShowMessage("You clicked my button!"));
}
private void ShowMessage(string message)
{
MessageBox.Show(message);
}
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);
}
正如你们中的一些人可能猜到的,编译器不喜欢这样。我不知道为什么,因为我习惯用Javascript做这样的事情:
public Form1()
{
InitializeComponent();
myButton.Click = new EventHandler(ShowMessage("You clicked my button!"));
}
private void ShowMessage(string message)
{
MessageBox.Show(message);
}
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);
}
我糊涂地度过了难关,最终做了一件非常丑陋的事情,涉及到一个全局变量,比如:
public Form1()
{
InitializeComponent();
myButton.Click = new EventHandler(ShowMessage("You clicked my button!"));
}
private void ShowMessage(string message)
{
MessageBox.Show(message);
}
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);
}
我有两个问题:第一,有没有更干净的方法?第二,为什么事件方法必须分配一个
+=
,而不仅仅是一个=
?因为可以添加多个处理程序,就像在javascript代码中一样,onclick中只会调用一个函数
例如:
myButton.Click += ShowMessage;
myButton.Click += LogToFile;
当按钮点击时,ShowMessage和LogToFile两个函数都会被调用。这就是“+=”中的“+”试图表示的内容。您正在添加到处理程序,而不是替换它
为了使其更容易,您可以使用匿名lamdas来帮助like,但请注意,这会使以后分离/删除处理程序变得更困难(如果这很重要的话)
这里是我的两个问题:第一,是什么
有没有更干净的方法
是的,匿名函数,就像JavaScript(其他语法)一样
为什么必须使用事件方法
分配了+=而不仅仅是=
否则,同一事件只能有一个eventhandler,而不能有多个eventhandler在编程语言中经常用于添加内容用于将变量设置为值。必须将事件处理程序添加到具有
+=
的事件中,因为该事件可能有多个特定代码段未知的其他委托。纯赋值意味着能够删除其他关联的委托,这是您作为事件客户端不应有的权限
此外,您可能希望利用匿名委托来完成任何形式的参数绑定。例如:
myButton.Click += delegate(object sender, EventArgs e) {
MessageBox.Show("You clicked my button!");
};
您可以键入
myButton.Click+=delegate{showmessage(“您单击了我的按钮!”);}代码>尝试此解决方案,以避开全局变量的需要,并为事件处理程序提供一个命名的、可重用的方法:
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!");
};
}
您也可以使用lambda
myButton.Click += (sender, e) => {
MessageBox.Show("You clicked my button!");
};
尝试使用匿名代理时的一个警告;除非将该委托指定给长期变量,否则将无法将该委托与事件分离。这是因为没有对委托进行语义检查;它们仅通过引用等同,因此没有其他匿名委托,即使代码完全相同,也不会与附加的委托具有相同的引用。