为了账号安全,请及时绑定邮箱和手机立即绑定

.net中事件中的sender对象为什么是事件源对象呢?

.net中事件中的sender对象为什么是事件源对象呢?

扬帆大鱼 2018-12-05 11:03:21
事件中的sender对象为什么说是事件源对象呢?事件的本质是委托,委托只是自定义的一种类型,系统的委托是这么定义的:public delegate void EventHandler(object sender, EventArgs e)为啥就说sender是事件源了。看我写的代码:private void button1_Click(object sender, EventArgs e)        {            Button b = (Button)sender;            b.Click += new EventHandler(my_click_method);          }        public void my_click_method(object sender, EventArgs e)        {            MessageBox.Show("显示消息");        }上面的代码中:为什么将上面的sender转换成Button类型,就会得到“当前”点击的Button对象了,这是怎么一回事啊?微软是怎么得到这个事件源对象sender的呢??想不通啊!求救!!!
查看完整描述

2 回答

?
Smart猫小萌

TA贡献1911条经验 获得超7个赞

说明你对委托/事件没有充分理解。Button类大概看起来是这样的(省略了一些不相关的东西)

class Button
{
      public event EventHandler OnClick;
      public void Click()
      {
             if (OnClick != null)  OnClick(this, null);
             //处理Click事件
      }
}

首先是为什么需要这个OnClick事件:Button类已经封装了Click方法,你无法去修改它的内容,也就是说点了Button之后的行为,是写死在Click方法里不能修改的。这样的话就会很不方便(比如我希望点了Button它就变色或者其他效果)。OnClick事件就是为了这种情况设计的。你注册了OnClick事件之后,当Button的Click方法被执行时,会发现你注册了OnClick事件(也就是说你希望点击Button时能执行一些“你自己的代码”)。这时就会先执行OnClick委托,同时传入了两个参数,一个是this(这里是Button类的实例),因此你在委托里能够把第一个参数sender转换成Button对象。第二个参数就是EventArgs,这里我随便传了个null,实际中你应该传入一些跟当前点击事件相关的数据,比如点击的位置等。


查看完整回答
反对 回复 2018-12-09
?
小怪兽爱吃肉

TA贡献1852条经验 获得超1个赞

所谓事件源,就是触发这个事件的对象。在内部需要定义委托和事件,定义委托时包括参数,比如EventHandler接收两个参数,一个是sender,一个是e,在内部要抛出这个事件时,需要调用方法抛出事件,这时也要传递两个参数,一个就是触发这个事件的button,另一个就是EventArgs。上层捕获到事件后,通过强制类型转换即可得到相应的那个触发事件的对象了。

查看完整回答
反对 回复 2018-12-09
  • 2 回答
  • 0 关注
  • 710 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信