可以将值传递给事件处理函数吗?

本文关键字:事件 处理函数 值传 | 更新日期: 2023-09-27 18:18:45

我想在事件列表的属性框上使用带有参数的函数。visual studio右边的这个列表框只允许一些带有对象发送器和事件参数的函数,而不显示带有参数的自定义函数。这是一个普遍的行为还是我应该寻找一个错误?

可以将值传递给事件处理函数吗?

您可以简单地使用按钮的CommandArgument

yourButton.Click += new EventHandler(yourButton_Click); yourButton.CommandArgument = "your parameters";

和事件处理程序方法中执行以下操作:

string yourParameters = (sender as Button).CommandArgument.ToString()

编写EventArgs的后代。

public class MyEventArgs: EventArgs {
    public MyEventArgs(string arg1, int arg2) {
        this.MyValue = arg1;
        this.MyNumber = arg2;
    }
    public string MyValue;
    public int MyNumber;
} 

现在它是一个ok参数的EventHandler,当你写一个e,将有MyValue和MyNumber属性

Button.Click就是这样定义的,没有办法改变。然而,

yourButton.Click += delegate { YourButton_click(1); }

你只能注册与事件声明(委托签名)相对应的事件处理程序。

如果你想使用预定义的事件而不创建自己的事件,你必须遵循事件处理程序签名

在。net中使用事件的正确方法如下:

  • 使用名称以EventHandler
  • 结尾的委托
  • 这个委托有两个参数,senderesender必须是object类型,并且应该包含对引发事件的类的实例的引用。e必须是继承自EventArgs(通常是EventArgs本身)的类型。e是包含事件数据的实例。

你不能期望找到任何其他事件处理程序签名,它总是(object sender, XXXEventArgs e)

请注意,当您引发事件并且不需要传递事件数据时,应使用EventArgs.Empty

public delegate void MyEventHandler(object sender, EventArgs e);
public event MyEventHandler MyEvent;
public void OnMyEvent()
{
    if (this.MyEvent != null)
    {
        this.MyEvent(this, EventArgs.Empty);
    }
}