事件中的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的呢??想不通啊!
求救!!!
说明你对委托/事件没有充分理解。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,实际中你应该传入一些跟当前点击事件相关的数据,比如点击的位置等。
所谓事件源,就是触发这个事件的对象。在内部需要定义委托和事件,定义委托时包括参数,比如EventHandler接收两个参数,一个是sender,一个是e,在内部要抛出这个事件时,需要调用方法抛出事件,这时也要传递两个参数,一个就是触发这个事件的button,另一个就是EventArgs。上层捕获到事件后,通过强制类型转换即可得到相应的那个触发事件的对象了。
这种object sender, EventArgs e格式是。net给你封装的一种格式,当然你可以不采用这种格式。
这个是.NET的一个编码规范,为了统一编码风格。
也就说sender参数是 事件调用那个方法的时候会把当前控件对象传给这个参数