`
xitongyunwei
  • 浏览: 925256 次
文章分类
社区版块
存档分类
最新评论

自定义控件添加事件

 
阅读更多

事件,委托,总是看起来有点绕,不过本文不介绍这些,只说说如何为自定义控件添加自定义事件。

本文所说的自定义控件,非继承其他现有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);

}

}

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

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics