C#中如何定义带参数的EventHandler?

简述

        事件调用的所有方法都需要两个参数:object sender,EventArgs e。该事件使用这两个参数调用方法,因此我们不能直接添加自定义参数。

        比如下面这段代码,我们想在 MessageBox 中显示字符串 ' s ',这必然是不成。

private void Form1_Load (object sender, EventArgs e)
{
      string s = "Hello!";
      button.Click += new EventHandler(show_msg);
}

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

        你肯定要问,我为什么一定要传参数,我定义全局的不成么?当然可以,但是假如你这个事件关联到全局的字典,在事件里面要区分是谁调用,那就有用了。

        你可能还要问,那我再sender里面定义一些参数不就成了么?确实也可以,但是假如是跨进程呢,事件是由其它进程触发,我们无法挂载任何多余信息,而且进程状态不可控,并且关联到我们系统内的id,那么就需要再事件里面找到id,根据什么找呢?

        所以更好的方法就是在绑定事件的时候,就把自定义的参数传入。

        最简单的解决方案肯定是使用委托来调用我们的方法。

使用lambda 运算符

        代码清晰,简单方便

private void Form1_Load (object sender, EventArgs e)
{
      string s = "Hello!";
      button.Click += (sender2, e2) => show_msg(sender2, e2, s);
}

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

使用委托重写

private void Form1_Load (object sender, EventArgs e)
{
    string s = "Hello!";

    button.Click += delegate(object sender2, EventArgs e2)
    {
        show_msg(sender2, e2, s);
    };
}

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

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

坐望云起

如果觉得有用,请不吝打赏

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值