CompositeControl 后篇 --事件冒泡
我们上一篇已经开发一个登录的组合控件,但是我们把控件的事件的这个问题没有解决,现在我们就来看看这个问题。
因为我们的组合控件Login是由一些已经存在的服务器控件的组合的,这样就省却了我们很多的麻烦,上篇中我们已经把子控件的一些属性,如Text等,显示呈现为了组合控件的属性。我们将之称为“属性的冒泡”(我自己这样认为的)。
我们现在来想下:其实我们点击“提交”按钮,我们就想把控件中信息发送给服务器,然后验证。即,我们点击的是“提交”按钮,但是触发的确实Login控件的验证事件。也就是说,我们应该把子控件-button的事件,上升冒泡成为Login的事件。
现在我们就正式讲讲怎么来事件冒泡。
对于事件的一些步骤,大家应该还记得:
1。定义一个数据类,用来当发生事件时,我们把一些信息携带。在本控件中,当我们点击“提交”按钮时,我们就把用户名和密码作为数据送到服务器。所以我们的数据类包含两个信息:如下:
- public class ValidateEventArgs : EventArgs
- {
- private string userName;
- private string userPassward;
- public string UserName
- {
- get
- {
- return userName;
- }
- }
- public string UserPassward
- {
- get
- {
- return userPassward;
- }
- }
- public ValidateEventArgs(string username, string userpassward)
- {
- this.userName = username;
- this.userPassward = userpassward;
- }
- }
相信大家对上面的代码不陌生!!!
2.我们来定义一个委托:
- public delegate void ValidateEventHandler(object sender,ValidateEventArgs args);
3.定义事件。
- private static readonly object ValidateEventKey = new object();
- public event ValidateEventHandler ValidateUserInfoChanged
- {
- add
- {
- Events.AddHandler(ValidateEventKey, value);
- }
- remove
- {
- Events.RemoveHandler(ValidateEventKey, value);
- }
- }
- protected virtual void OnValidateChanged(ValidateEventArgs args)
- {
- ValidateEventHandler handler = Events[ValidateEventKey] as ValidateEventHandler;
- if (handler != null)
- handler(this, args);
- }
4.好了;准备都做好了,下面我们只要把这个事件冒泡成为Login的控件的就行了。其实很简单的。只要重写一个方法就行了。如下:
- protected override bool OnBubbleEvent(object source, EventArgs args)
- {
- bool handled = false;
- CommandEventArgs ce = args as CommandEventArgs;
- if (ce != null && ce.CommandName == "Validate")
- {
- handled = true;
- string userName = this.txtUserName.Text;
- string userPassward = this.txtUserPassward.Text;
- //把信息输入
- ValidateEventArgs ve = new ValidateEventArgs(userName, userPassward);
- OnValidateChanged(ve);
- }
- return handled;
- }
好了,完了,就这样了。
完整代码附上: