所有的事件,都有两个参数(object sender, System.EventArgs e),什么意思?

zsdlOO 2010-10-18 03:41:52
所有的事件,都有两个参数(object sender, System.EventArgs e),什么意思?
我发现,不管什么事件,总会有这两个参数,而且我最不明白的是,在事件处理程序中,多数都用不到这两个参数,
也就是说,事件的处理程序中,根本找不到这两个参数名,所以我不明白, 这两个参数的作用是什么?
这两个参数是如何起作用的?
...全文
780 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
linyu622 2012-03-11
  • 打赏
  • 举报
回复
第一个指哪个控件吧~~~~第二个不知
LorenLiu 2010-10-19
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 zsdloo 的回复:]
举例吧,第一个参数为何有必要呢(我当然知道它的必要性,但是我想了解必要性在哪里)?
假如没有第一个参数时,我完全可以用控件的名称呀,
比如:
Button btn = (Button)sender;
MessageBox.Show(btn.Text);
完全可以用(这个按钮的名字为 button1):
MessageBox.Show(button1.Text);

从这个意义上……
[/Quote]

打个比方,假如两个button使用了同一个handler,用你的方法能告诉我MessageBox该show哪个的text吗?
zsdlOO 2010-10-19
  • 打赏
  • 举报
回复
举例吧,第一个参数为何有必要呢(我当然知道它的必要性,但是我想了解必要性在哪里)?
假如没有第一个参数时,我完全可以用控件的名称呀,
比如:
Button btn = (Button)sender;
MessageBox.Show(btn.Text);
完全可以用(这个按钮的名字为 button1):
MessageBox.Show(button1.Text);

从这个意义上说,第一个参数完全可以用对象的名称呀,可以为何要多出一个参数来呢?而且只要是事件,都会有两个参数,而且多数事件中,也用不到这两个参数?
蔡袅 2010-10-18
  • 打赏
  • 举报
回复
简单说:
第一个:触发事件的对象
第二个:这个事件包含的一些参数,比如坐标等等
zsdlOO 2010-10-18
  • 打赏
  • 举报
回复

private void button1_Click(object sender, EventArgs e)
{
Button btn = (Button)sender;
MessageBox.Show(btn.Text);
MessageBox.Show(button1.Text);
}


不用 sender 参数,用按钮的名称,不也同样达到相同的功能吗?
我还是不明白,这个代表对象自已的参数有什么必要性,用对象的名称,不就可以了吗?
rainsnowclowd 2010-10-18
  • 打赏
  • 举报
回复
为什么你会觉得没用,那是因为你从前台做到后台,所以你觉得没用,
假如现在让你实现一个button的click事件,就给你一个方法名

protected void Click(object sender,EventArgs e);

就让你实现修改该文本框的相关属性,但是就是不告诉你控件id,你肯定要大呼变态。怎么可能实现啊。


其实很简单了

protected void Click(object sender,EventArgs e)
{
Button but = (Button)sender;
...
}

ms既然給你留了這些東西,那多多少少都會有它的作用的,如果一點用都沒有,ms那些工程師不都是白癡了。
sxldfang 2010-10-18
  • 打赏
  • 举报
回复
private void txtKeyPress(object sender, KeyPressEventArgs e)
{
....
}

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

这是你的事件处理程序就要通过 sender 参数获取是哪个文本框激发了该事件,e中可获取按键的相关信息
flyerwing 2010-10-18
  • 打赏
  • 举报
回复
也可以没有的吧,
周药师 2010-10-18
  • 打赏
  • 举报
回复
对于系统提供的类的事件,Sender参数只是简单地传递了指向引发事件的那个类的实例的一个引用,而e是EventArgs类型的参数,它包含了事件所携带的信息。

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

另外需要明确的一个概念就是类似这样形式的方法:
private void Button_Click(object sender, EventArgs e)
这样的方法称为事件处理方法,它类似于C语言中的事件处理函数,它是在运行时由系统调用的,因此它的参数不会变化,就好像我们写方法时的方法名一样。
dai821 2010-10-18
  • 打赏
  • 举报
回复
Sender参数只是传递了指向引发事件的那个类的实例的一个引用
而e是EventArgs类型的参数,它包含了事件所携带的信息(从里面能拿到不少东西)
上海程序员3 2010-10-18
  • 打赏
  • 举报
回复
前面的指事件对应的控件,后面的表示事件传递的参数,第二个不一定是System.EventArgs,因为所传递的内容格式有可能不同。
内容概要:本文系统研究了开关频率大于谐振频率(fs>fr)工况下,移相混合控制LLC谐振变换器在低压增益区域的工作特性,深入分析其在变频与移相结合控制模式下的调制机理、工作模态划分及损耗分布规律。通过Simulink平台构建高保真仿真模型,对变换器在不同负载和输入条件下的电压增益、转换效率、关键器件电压电流应力等性能指标进行了全面仿真验证,重点探讨了其在低增益区间的软开关实现能力与效率优化潜力,旨在提升LLC变换器在宽范围输入输出应用中的动态响应与能源转换效率。; 适合人群:从事电力电子变换器设计、高频电源开发及相关领域的高校研究生、科研院所研究人员及企业研发工程师,要求具备扎实的电路理论基础、电力电子技术知识以及一定的Simulink仿真能力。; 使用场景及目标:①深入理解LLC谐振变换器在fs>fr条件下采用移相混合控制的内在工作机理与模态转换过程;②掌握利用Simulink搭建复杂谐振变换器精确仿真模型的方法与技巧;③分析并优化低压增益区的增益特性与损耗构成,为设计高效率、高功率密度的软开关电源提供理论依据和数据支持; 阅读建议:建议读者结合文中所述仿真模型,亲自复现仿真过程,重点观察不同控制参数(如移相比、开关频率)对电压增益曲线和关键波形的影响,并对比传统变频控制策略,深入探究混合控制在拓宽调压范围、提升轻载效率方面的优势,从而深化对现代高效谐振电源设计的理解。
内容概要:本文提出了一种基于粒子群优化算法(PSO)的配电网光伏储能双层优化配置模型,以IEEE33节点系统为标准算例,实现光伏发电单元与储能系统的协同选址与定容优化。该模型采用双层架构设计,上层以投资成本、运行经济性及网络损耗最小为目标优化设备配置方案,下层通过潮流计算评估系统在不同负荷场景下的运行性能,综合考虑电压稳定性、供电可靠性及可再生能源消纳能力,最终通过Matlab编程实现完整求解流程,为高渗透率分布式电源接入背景下的配电网规划提供了有效的技术支撑。; 适合人群:具备电力系统分析基础和Matlab编程能力的研究生、高校科研人员及从事新能源并网、智能配电网规划与优化的工程技术人员。; 使用场景及目标:①研究含高比例光伏接入的配电网规划与运行协同优化问题;②掌握双层优化建模方法与粒子群算法在复杂电力系统问题中的应用技巧;③为实际工程中分布式光伏与储能系统的科学选址与容量配置提供理论依据与仿真验证平台。; 阅读建议:建议读者结合Matlab代码深入理解双层迭代求解机制,重点关注算法收敛性分析、参数敏感性测试,并可通过更换初始种群、调整权重因子或引入其他标准测试系统(如IEEE69节点)进行对比实验,进一步验证所提模型的普适性与鲁棒性。

111,129

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Creator Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧