事件,委托,总是看起来有点绕,不过本文不介绍这些,只说说如何为自定义控件添加自定义事件。
本文所说的自定义控件,非继承其他现有Microsoft控件或者组合控件,而是完全继承UserControl的东西。
既然不是继承自其他现有控件或者控件组合,在特定需求下,有添加自定义事件的可能性,或者对继承自UserControl而得到的事件进行些许扩展,以期以简便的方式得到更丰富的信息等等。
下面简单介绍2个例子,有用之人作为参考,大拿级别的,ignore吧。
例1. 添加完全自定义事件。
需求:
假设客户端(指添加了自定义控件的窗体等等)想知道用户是否在控件上按下的Shift键(当然,可以通过KeyPress之类的事件来判断,没必要再自己整个事件,例子只是个例子),控件作者想通过一个特殊的方式来进行判断,这就可以选择自定义事件。
好吧,起个名字,叫Custom,需要客户端在触发Custom时得到一个布尔属性Flag来判断用户是否按下Shift。
按部就班:
(1)创建事件
// 创建事件
publiceventCustomEventHandler Custom;
有问题,CustomEventHandler是什么,当然,这里需要一个委托,于是还是搞定这个委托
(2)定义委托
// 定义委托
publicdelegatevoidCustomEventHandler(objectsender, CustomEventArgs e);
CustomEventHandler搞定了,又有新问题:CustomEventArgs是啥,其实需要CustomEventArgs来获得你需要的数据,CustomEventHandler,于是还要定义个CustomEventArgs(这个东西必须继承自System.EventArgs),在CustomEventArgs里面定义需要的数据属性:Flag
(3)定义EventArgs
// 自定义EventArgs,并添加自定义属性【Flag】
publicsealedclassCustomEventArgs:EventArgs
{
privatebooltestFlag;
publicCustomEventArgs(booltestFlag)
{
this.testFlag = testFlag;
}
publicboolFlag
{
get{returntestFlag; }
}
}
有了CustomEventArgs,以后在触发事件之后便可以从e.Flag中得到数据。
事件定义完了,这下看看效果先:
能看到在属性窗口中已经能见到Custom事件
可是Custom到底是怎么执行和在控件内部触发的呢,想破头~
(4)执行事件的代码
需要一个OnCustom来完成任务
// 执行事件
protectedvirtualvoidOnCustom(CustomEventArgse)
{
if(Custom !=null)
{
Custom(this, e);
}
}
来完成调动客户端的任务,现在问题的关键就在于在合适的地方执行一下OnCustom就可以了,在何处执行,全看你需要的数据在什么地方能后取得或者发生变化,本例简单点,就在控件本身的KeyDown事件里面好了:
(5)何处执行OnCustom
// 触发事件处
privatevoidMyControl_KeyDown(objectsender,KeyEventArgse)
{
// 此处省略无关代码。。。
// 客户端按下Shift键与否
booltestFlag = e.Shift;
CustomEventArgseArgs =newCustomEventArgs(testFlag);
// 触发事件
OnCustom(eArgs);
// 此处省略无关代码。。。
}
至此算基本完成,看下最终效果:
在测试窗体上使用自定义控件的Custom事件
例2.对原有事件进行一定扩展,并覆盖原事件
需求:
想在KeyPress中再多获得一些数据,起个名字:KeyAscii,但是KeyPress中没有这个,那就自定义一个CustomKeyPress,不用KeyPress,并使其在客户端隐藏
隐藏的办法:
// 屏蔽KeyPress事件使其在客户端不可见
[Browsable(false)]
publicneweventKeyPressEventHandlerKeyPress;
以后跟例一差不多了,
创建事件,委托:
// 创建事件CustomKeyPress替代KeyPress
publiceventCustomKeyPressEventHandlerCustomKeyPress;
// 定义委托
publicdelegatevoidCustomKeyPressEventHandler(objectsender,CustomKeyPressEventArgse);
CustomKeyPressEventArgs要继承自KeyPressEventArgs,而System.Windows.Forms.KeyPressEventArgs其实继承自System.EventArgs
// 自定义KeyPressEventArgs,并添加自定义属性【KeyAscii】
publicsealedclassCustomKeyPressEventArgs:KeyPressEventArgs
{
privateInt32keyAscii;
publicCustomKeyPressEventArgs(Int32keyAscii) :base((char)keyAscii)
{
this.keyAscii = keyAscii;
}
publicInt32KeyAscii
{
get{returnkeyAscii; }
}
}
触发事件处:
// 触发事件处
protectedoverridevoidOnKeyPress(KeyPressEventArgse)
{
if(CustomKeyPress !=null)
{
CustomKeyPressEventArgseArgs =newCustomKeyPressEventArgs(e.KeyChar);
CustomKeyPress(this, eArgs);
}
base.OnKeyPress(e);
}
需要特别注意的是,KeyPress被隐藏之后,控件本身的KeyPress事件也将不能被触发
更新:
关于隐藏事件,其实有别的办法,
即添加一个Class,继承ControlDesigner,重写中的相关方法,然后在控件上面Attribute一下:[DesignerAttribute(typeof(自己添加的Class))]
注意,之前所谓的“在客户端隐藏”,有点用词不当,这其实是指在VS IDE的属性窗口中不可见,并不意味着无法在客户端访问,其实使用代码还是可以的。
文章转自:http://blog.csdn.net/hugengyong/article/details/5653538
分享到:
相关推荐
给自定义控件添加自定义事件,该事件在测试界面添加后可以显示,并通过双击设定事件的响应方法
C# 自定义控件的属性 添加自定义控件的事件
当QTwidget的控件不满足开发者的需求的时候,如何在QT中快捷的添加自定义控件
博文《在VS2008中创建自定义控件(四)为自定义控件添加默认值》(http://blog.csdn.net/smallfools/archive/2010/06/01/5638751.aspx)的源代码
C#的ListView添加各种自定义控件,CheckBox,ComboBox等
希望事件响应代码推迟到使用自定义控件的窗体里写。 步骤一:新建一个用户控件,放两个按钮,Tag分别是btn1,btn2. 这两个按钮的共用单击事件处理代码如下: using System; using System.Collections....
自定义 Windows 窗体 DataGridView 控件 现有的几种嵌套控件,但无时间控件类型,下载代码中就是嵌套了时间控件类。 System.Windows.Forms.DataGridViewTextBoxColumn, System.Windows.Forms.DataGridView...
Visionpro 控件自定义添加
unity添加自定义控件Demo
duilib中添加自定义控件,包括图片和代码等.
c# winform自定义控件包括button、进度条、box、提示框、外观等 内含使用实例工程方便使用和上手
学习创建和使用自定义控件写的试验代码,centos qt5.8可以使用。具体实现过程见我的文章:http://blog.csdn.net/csdn83419527/article/details/78870487 调试过程中出现的问题都有描述。另外控件代码用的lx100991的...
自定义控件属性使用及属性详情;组合实现组合控件,奠定完全绘制自定控件前提。
自定义控件上添加滚动条的源码 环境:vs2005 C#2.0
MFC自定义控件,包括按钮 编辑框 列表框 树形控件 菜单控件等(注:不是工程,只有源代码)。
在DataGridView中实现了使用自定义控件的功能,是用来学习DGV控件自定义控件的示例程序,注释和说明都比较详细
使用 VS2013 模仿网络上的文章进行自定义控件开发代码。 1. 项目的整个文件目录名称都必须是英文的,否则测试和编译的时候,系统会报告莫名其妙的错误。 2. 自定义控件(部件)的名称必须是英文的,否则测试和编译的...
WpfApp_Move(自定义控件的放大缩小,动态添加控件保存)源代码WpfApp_Move(自定义控件的放大缩小,动态添加控件保存)源代码 可动态多动控件,放大控件,添加控件,添加属性保存到xml中启动的时候读取。