先说说需求,也就是我们要达到的效果,希望扩展按钮控件,增加一些属性,但同时我们希望默认事件仍使用Click事件,不过,在事件参数中,我们希望能够传递更多的信息,而不是Button.Click默认的参数。
当然,我们首先要写一个自定义的事件参数,为了简单起见,我们的自定义按钮控件,增加一个TagNumber属性,它传递一个整型数据,当我们处理控件的Click事件,能够从事件参数类实例中取得我们在这个属性中设置的值,因此,我们需要一个MyButtonClickAgre,它从EventArgs类派生。
/// <summary>
/// 自定义事件参数类。
/// </summary>
internal class MyButtonClickAgre : EventArgs
{
int _value;
public MyButtonClickAgre(int n)
{
this._value = n;
}
public int TheNumber
{
get { return this._value; }
}
}
现在,从Button类派生一个新类。
public class MyButton:Button
{
int _num;
// 构造函数
public MyButton()
: base()
{
this._num = 0;
}
/// <summary>
/// 用作参数传递的整型数据。
/// </summary>
[System.ComponentModel.Browsable(true)]
[System.ComponentModel.Description("获取或设置一个整数。")]
[System.ComponentModel.Category("数据")]
public int TagNumber
{
get { return this._num; }
set { this._num = value; }
}
}
好,TagNumber属性定义好了,Browsable特性表示控件中设计时是否显示在“属性”窗口中,Description用一些文本描述属性有什么用途这类的信息,Category表示该属性在“属性”窗口属于哪个类别,可能很多人觉得要传递一个英文的字符串作为分类名,其实不一定,如果你的VS是中文版的,你完全可以使用中文名字,如上面的“数据”。
在“属性”窗口中浏览该控件的属性如下图所示。
下面,我们还有一件重要的事情要做,那就是重写基类的Click事件。这里有两种方法:
1、第一种方法不算得上是重写事件,应该说是我们经常做的重写On????方法,如我们下面要通过重写OnClick方法来达到我们要的效果。
/// <summary>
/// 重写OnClick方法。
/// </summary>
protected override void OnClick(EventArgs e)
{
base.OnClick(new MyButtonClickAgre(this._num));
}
这样,我们自定义的事件参数就传到事件处理程序了。
2、第二种方法才算是重写事件,通过new关键字重新定义一个Click事件。
// 新的Click事件。
public new EventHandler Click;
/// <summary>
/// 重写OnClick方法。
/// </summary>
protected override void OnClick(EventArgs e)
{
if (Click != null)
{
Click(this, new MyButtonClickAgre(this._num));
}
}
这个时候,我们就不需要基类的OnClick方法了,所以也不用再写上base.OnClick(e);。
现在,我们重新生成一下项目,切换到WinForm设计器窗口,在工具箱中就能看到我们自定义的控件了。
好,现在可以测一测这个新控件了。
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void myButton1_Click(object sender, EventArgs e)
{
if (e is MyButtonClickAgre)
{
MyButtonClickAgre ce = e as MyButtonClickAgre;
if (ce != null)
{
MessageBox.Show(ce.TheNumber.ToString());
}
}
}
}
看看结果。
分享到:
相关推荐
工具集合:各种基类,蓝牙控制,自定义总线,加密解密,SQLite数据库,Socket保持长连接,UDP通信,图片处理,日期处理,弹出自定义对话框,GSP获取,计时器,通知栏下载,处理队列,延迟操作,防粘连操作,文件处理...
2.定义Shape类的派生类三角形Tangle,使用base关键字调用基类构造函数,重写Shape类继承的虚方法:求面积虚方法Mianji(),求周长虚方法Zhouchang()。 3.定义Shape类的派生类圆形Circle,重写Shape类继承的虚方法:...
按以下描述和要求建立两个类:基类 Rectangle(矩形类) 和派生类 Cube(正方体) 1. Rectangle 私有成员: double x1, y1; //左下角的坐标 double x2, y2; //右上角的坐标 公有成员: 带缺省值的构造...
DataVideoClip、UpdatedVideoClip、ImageClip、ColorClip、TextClip类详解.rar
定义Shape类的派生类三角形Tangle,使用base关键字调用基类构造函数,重写Shape类继承的虚方法:求面积虚方法Mianji(),求周长虚方法Zhouchang()。 3.定义Shape类的派生类圆形Circle,重写Shape类继承的虚方法:求...
moviepy音视频剪辑:视频剪辑基类VideoClip的属性及方法详解.rar
moviepy音视频剪辑:视频剪辑基类VideoClip详解.rar
VC Excel操作常用接口类库文件,Excel接口,导入类头文件: CApplication.h、 CRange.h 、CWorkbooks.h、CWorkbook.h、CWorksheets.h、CWorksheet.h。
MLS模型模型基类
古典 #### TypeScript BCL版本0.2 介绍 TypeScript已发布。 现在,我们在网络上有了... 我们Classical的目标是为TypeScript提供一个与浏览器无关的基类库,并为您提供真正使用JavaScript进行应用程序规模开发所需的工具
策略基类/ 基于QAAccount/QACEPEnging/QASPMS/QAREALTIMECollector/QATRADER QAStrategy支持协议 QAStrategy 的实盘使用天勤的下单网关(Open-Trade-Gateway) 如果是天勤的用户 你可以理解为这是另一个版本的tqsdk ...
moviepy音视频开发:音频剪辑基类AudioClip.rar
在创建可用作其他类的基类的类时,应考虑如下事实:事件是特殊类型的委托,只可以从声明它们的类中调用。派生类无法直接调用基类中声明的事件。尽管有时需要事件仅由基类引发,但在大多数情形下,应该允许派生类调用...
moviepy音视频开发:音频剪辑基类AudioClip详解.rar
模型基类:之前初始化模型总要这么写: @interface SPExangeModel : NSObject /*!模型属性*/ @property (nonatomic, copy) NSString * city; @property (nonatomic, copy) NSString * content; @property (nonatomic...
ee 排队基类和现成品安装$ npm install qee用import Transform from 'qee/source/Transform' ;let queue = new TransformQueue ( ... transforms ) . process ( data ) ;延长import Queue from 'qee'class ...
2. 虚函数:在基类中冠以关键字 virtual 的成员函数。它提供了一种接口界面。允许在派生类中对基类的虚 函数重新定义。 3. 纯虚函数:在基类中为其派生类保留一个函数的名字,以便派生类根据需要对它进行定义。作为...