日期:2014-05-18  浏览次数:21082 次

所有的事件,都有两个参数(object sender, System.EventArgs e),什么意思?
所有的事件,都有两个参数(object sender, System.EventArgs e),什么意思?
我发现,不管什么事件,总会有这两个参数,而且我最不明白的是,在事件处理程序中,多数都用不到这两个参数,
也就是说,事件的处理程序中,根本找不到这两个参数名,所以我不明白, 这两个参数的作用是什么?
这两个参数是如何起作用的?


------解决方案--------------------
前面的指事件对应的控件,后面的表示事件传递的参数,第二个不一定是System.EventArgs,因为所传递的内容格式有可能不同。
------解决方案--------------------
Sender参数只是传递了指向引发事件的那个类的实例的一个引用
而e是EventArgs类型的参数,它包含了事件所携带的信息(从里面能拿到不少东西)
------解决方案--------------------
对于系统提供的类的事件,Sender参数只是简单地传递了指向引发事件的那个类的实例的一个引用,而e是EventArgs类型的参数,它包含了事件所携带的信息。

至于第二个问题,我不是很明白“我看到在很多事件代码中那些代码都是照写(object sender, System.EventArgs e),根本就不用改变sender和e,参数不是应该随实际情况变化的吗?”这句话的意思,比如说一个按钮控件,当它的单击事件被引发时,系统会自动把这个按钮对象作一个类型强制转换然后赋值给Sender,然后传递e。之所以都是这个形式是因为大多数情况下这些简单的事件不需要传递特殊的信息,您可以看一下KeyPress事件,这个事件就包含一个KeyPressEventArgs,包含了按键的信息。

另外需要明确的一个概念就是类似这样形式的方法:
private void Button_Click(object sender, EventArgs e)
这样的方法称为事件处理方法,它类似于C语言中的事件处理函数,它是在运行时由系统调用的,因此它的参数不会变化,就好像我们写方法时的方法名一样。
------解决方案--------------------
private void txtKeyPress(object sender, KeyPressEventArgs e)
{
....
}

比如有多个文本框,这些文本框在输入时只能输入数字等,你就可以编写一个函数,让所有的文本框的KeyPress事件(大概)都指向它。

这是你的事件处理程序就要通过 sender 参数获取是哪个文本框激发了该事件,e中可获取按键的相关信息
------解决方案--------------------
为什么你会觉得没用,那是因为你从前台做到后台,所以你觉得没用,
假如现在让你实现一个button的click事件,就给你一个方法名
C# code

protected void Click(object sender,EventArgs e);

------解决方案--------------------
简单说:
第一个:触发事件的对象
第二个:这个事件包含的一些参数,比如坐标等等