• 技巧篇:如何重写基类的事件


    先说说需求,也就是我们要达到的效果,希望扩展按钮控件,增加一些属性,但同时我们希望默认事件仍使用Click事件,不过,在事件参数中,我们希望能够传递更多的信息,而不是Button.Click默认的参数。

    当然,我们首先要写一个自定义的事件参数,为了简单起见,我们的自定义按钮控件,增加一个TagNumber属性,它传递一个整型数据,当我们处理控件的Click事件,能够从事件参数类实例中取得我们在这个属性中设置的值,因此,我们需要一个MyButtonClickAgre,它从EventArgs类派生。

    1. /// <summary>  
    2. /// 自定义事件参数类。  
    3. /// </summary>  
    4. internal class MyButtonClickAgre : EventArgs  
    5. {  
    6.     int _value;  
    7.   
    8.     public MyButtonClickAgre(int n)  
    9.     {  
    10.         this._value = n;  
    11.     }  
    12.   
    13.     public int TheNumber  
    14.     {  
    15.         get { return this._value; }  
    16.     }  
    17. }  


    现在,从Button类派生一个新类。

    1. public class MyButton:Button  
    2. {  
    3.     int _num;  
    4.   
    5.     // 构造函数  
    6.     public MyButton()  
    7.         : base()  
    8.     {  
    9.         this._num = 0;  
    10.     }  
    11.   
    12.     /// <summary>  
    13.     /// 用作参数传递的整型数据。  
    14.     /// </summary>  
    15.     [System.ComponentModel.Browsable(true)]  
    16.     [System.ComponentModel.Description("获取或设置一个整数。")]  
    17.     [System.ComponentModel.Category("数据")]  
    18.     public int TagNumber  
    19.     {  
    20.         get { return this._num; }  
    21.         set { this._num = value; }  
    22.     }  
    23.   
    24. }  

    好,TagNumber属性定义好了,Browsable特性表示控件中设计时是否显示在“属性”窗口中,Description用一些文本描述属性有什么用途这类的信息,Category表示该属性在“属性”窗口属于哪个类别,可能很多人觉得要传递一个英文的字符串作为分类名,其实不一定,如果你的VS是中文版的,你完全可以使用中文名字,如上面的“数据”。

    在“属性”窗口中浏览该控件的属性如下图所示。

    下面,我们还有一件重要的事情要做,那就是重写基类的Click事件。这里有两种方法:

    1、第一种方法不算得上是重写事件,应该说是我们经常做的重写On????方法,如我们下面要通过重写OnClick方法来达到我们要的效果。

    1. /// <summary>  
    2. /// 重写OnClick方法。  
    3. /// </summary>  
    4. protected override void OnClick(EventArgs e)  
    5. {  
    6.     base.OnClick(new MyButtonClickAgre(this._num));  
    7. }  


    这样,我们自定义的事件参数就传到事件处理程序了。

    2、第二种方法才算是重写事件,通过new关键字重新定义一个Click事件。

    1. // 新的Click事件。  
    2. public new EventHandler Click;  
    3.   
    4. /// <summary>  
    5. /// 重写OnClick方法。  
    6. /// </summary>  
    7. protected override void OnClick(EventArgs e)  
    8. {  
    9.     if (Click != null)  
    10.     {  
    11.         Click(this, new MyButtonClickAgre(this._num));  
    12.     }  
    13. }  


    这个时候,我们就不需要基类的OnClick方法了,所以也不用再写上base.OnClick(e);。

    现在,我们重新生成一下项目,切换到WinForm设计器窗口,在工具箱中就能看到我们自定义的控件了。

    好,现在可以测一测这个新控件了。

    1. public partial class Form1 : Form  
    2. {  
    3.     public Form1()  
    4.     {  
    5.         InitializeComponent();  
    6.     }  
    7.   
    8.     private void myButton1_Click(object sender, EventArgs e)  
    9.     {  
    10.         if (e is MyButtonClickAgre)  
    11.         {  
    12.             MyButtonClickAgre ce = e as MyButtonClickAgre;  
    13.             if (ce != null)  
    14.             {  
    15.                 MessageBox.Show(ce.TheNumber.ToString());  
    16.             }  
    17.         }  
    18.     }  
    19. }  


    看看结果。


     

  • 相关阅读:
    Beginning Auto Layout Tutorial in iOS 7: Part 2
    Beginning Auto Layout Tutorial in iOS 7: Part 1
    Autolayout 03
    Autolayout 02
    Autolayout 01
    Start Developing iOS Apps Today
    Spring 7大功能模块的作用
    struts2入门
    myeclipse导入工程 Some projects cannot be imported because they already exist in the workspace
    第十一章 Servlet MVC模式
  • 原文地址:https://www.cnblogs.com/xieweikai/p/6832830.html
Copyright © 2020-2023  润新知