首页 新闻 会员 周边

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

1
悬赏园豆:5 [已解决问题] 解决于 2011-10-25 18:47

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

事件的本质是委托,委托只是自定义的一种类型,系统的委托是这么定义的:public delegate void EventHandler(object sender, EventArgs e)

为啥就说sender是事件源了。

看我写的代码:

 1         private void button1_Click(object sender, EventArgs e)
2 {
3 Button b = (Button)sender;
4 b.Click += new EventHandler(my_click_method);
5 }
6
7 public void my_click_method(object sender, EventArgs e)
8 {
9 MessageBox.Show("显示消息");
10 }

上面的代码中:为什么将上面的sender转换成Button类型,就会得到“当前”点击的Button对象了,这是怎么一回事啊?微软是怎么得到这个事件源对象sender的呢??想不通啊!

求救!!!

激流勇进的主页 激流勇进 | 菜鸟二级 | 园豆:206
提问于:2011-10-25 00:23
< >
分享
最佳答案
0

说明你对委托/事件没有充分理解。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,实际中你应该传入一些跟当前点击事件相关的数据,比如点击的位置等。

收获园豆:2
水牛刀刀 | 大侠五级 |园豆:6350 | 2011-10-25 10:42
其他回答(3)
1

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

收获园豆:1
致远书生 | 园豆:409 (菜鸟二级) | 2011-10-25 08:29
0

这种object sender, EventArgs e格式是。net给你封装的一种格式,当然你可以不采用这种格式。

收获园豆:1
顾晓北 | 园豆:10844 (专家六级) | 2011-10-25 08:44
0

这个是.NET的一个编码规范,为了统一编码风格。
也就说sender参数是 事件调用那个方法的时候会把当前控件对象传给这个参数

收获园豆:1
慧☆星 | 园豆:5640 (大侠五级) | 2011-10-25 09:30
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册