Csharp 事件中sender的用法

举个栗子,播放器左下角的播放控制开关我是用Label控件实现的,在鼠标进入,鼠标按下,鼠标抬起,鼠标离开的时候会显示不同颜色的效果,给用户一个很直观的感受(默认控件是需要添加相应的事件才能有这个效果),然而现在有N个Label控件需要实现相同的功能。

《Csharp 事件中sender的用法》
当然我们可以为每个Label控件都添加一个相应的事件代码(冗余?繁琐?),为了实现多个Label控件共同使用一个事件代码,先看MouseEnter鼠标进入事件的代码..

        private void label1_MouseEnter(object sender, EventArgs e) 
        {
            //此处省略一百万行代码
        }

该事件还有两个参数,一个是object类型的sender,还有一个是EventArgs类型的e。

sender参数用于传递指向事件源对象的引用。简单来讲就是当前的对象。例子中就是触发MouseEnter事件的那个Label控件,它是object类型是C#里所有类的基类,万物基于object(滑稽),所以控件同样也是继承于object的,所以将sender进行类型转换就能直接得到触发事件的控件对象。

e参数是是EventArgs类型。简单来理解就是记录事件传递过来的额外信息。一般用于传递用户点击的位置啊,键盘按下的键等事件的额外信息。例如TextBox中有一个KeyPress事件。在事件里可以通过e点出来,不过不同的事件传递的信息也会不同。

        private void dmLabel1_MouseEnter(object sender, EventArgs e)  //鼠标进入改变颜色
        {
            DMLabel currtenLabel = (DMLabel)sender;//使用sender来获取当前触发事件的控件,可以在同一个方法中进行事件的响应,能够使代码的重用性提高,也能更简洁    
            //DMLabel currtenLabel = sender as DMLabel;
            currtenLabel.DM_Color = Color.Red;           
        }

以上DMLabel currtenLabel = (DMLabel)sender就是把sender类型转换为DMLabel类型,也可以写成DMLabel currtenLabel = sender as DMLabel
建议平时使用第二种带as操作符的方法,因为它比第一种的强制转型要安全,而且在运行时层面也有比较好的效率(注意的是as和is操作符都不执行任何用户自定义的转换,只有当运行时类型与目标转换类型匹配时,它们才会转换成功)。

如果此时需要Label的名称我们就可以使用currtenLabel.name,这样就可以通过判断currtenLabel.name为不同的Label添加不同的执行代码..

点赞
  1. 趣知识说道:

    我有好长时间不用C#了

  2. 纺织知识说道:

    高技术的文章

  3. 头条说道:

    文章不错非常喜欢

发表评论

电子邮件地址不会被公开。 必填项已用*标注