原文:ASP.NET自定义控件组件开发 第四章 组合控件开发CompositeControl 后篇 --事件冒泡

CompositeControl  后篇 --事件冒泡

系列文章链接:

ASP.NET自定义控件组件开发 第一章 待续

ASP.NET自定义控件组件开发 第一章 第二篇 接着待续

ASP.NET自定义控件组件开发 第一章 第三篇

ASP.NET自定义控件组件开发 第二章 继承WebControl的自定义控件

ASP.NET自定义控件组件开发 第三章 为控件添加事件 前篇

ASP.NET自定义控件组件开发 第三章 为控件添加事件 后篇

ASP.NET自定义控件组件开发 第四章 组合控件开发CompositeControl

ASP.NET自定义控件组件开发 第四章 组合控件开发CompositeControl 后篇 --事件冒泡

ASP.NET自定义控件组件开发 第五章 模板控件开发

ASP.NET2.0自定义控件组件开发 第六章 深入讲解控件的属性

ASP.NET2.0组件控件开发视频 初体验

我们上一篇已经开发一个登录的组合控件,但是我们把控件的事件的这个问题没有解决,现在我们就来看看这个

问题。

因为我们的组合控件Login是由一些已经存在的服务器控件的组合的,这样就省却了我们很多的麻烦,上篇中我

们已经把子控件的一些属性,如Text等,显示呈现为了组合控件的属性。我们将之称为“属性的冒泡”(我自己这样认为

的)。

我们现在来想下:其实我们点击“提交”按钮,我们就想把控件中信息发送给服务器,然后验证。即,我们点击

的是“提交”按钮,但是触发的确实Login控件的验证事件。也就是说,我们应该把子控件-button的事件,上升冒泡成为

Login的事件。

现在我们就正式讲讲怎么来事件冒泡。

对于事件的一些步骤,大家应该还记得:

1。定义一个数据类,用来当发生事件时,我们把一些信息携带。在本控件中,当我们点击“提交”按钮时,我

们就把用户名和密码作为数据送到服务器。所以我们的数据类包含两个信息:如下:

Code
 1 public class ValidateEventArgs:EventArgs 
 2     {
 3         private string userName;
 4         private string userPassward;
 5 
 6         public string UserName
 7         {
 8             get
 9             {
                 return  userName ;
             }
         }
 
         public string UserPassward
         {
             get
             {
                 return userPassward;
             }
         }
 
         public ValidateEventArgs(string username, string userpassward)
         {
             this.userName = username;
             this.userPassward = userpassward;
         }
     }

相信大家对上面的代码不陌生!!!

2.我们来定义一个委托:

Code
 public delegate void ValidateEventHandler(object sender,ValidateEventArgs args);

3.定义事件。

Code
 1  private static readonly object ValidateEventKey = new object();
 2         public event ValidateEventHandler ValidateUserInfoChanged
 3         {
 4             add
 5             {
 6                 Events.AddHandler(ValidateEventKey, value);
 7             }
 8             remove
 9             {
                 Events.RemoveHandler(ValidateEventKey, value);
             }
         }
 
         protected virtual void OnValidateChanged(ValidateEventArgs args)
         {
             ValidateEventHandler handler = Events[ValidateEventKey] as ValidateEventHandler;
             if (handler != null)
                 handler(this, args);
         }
     

4.好了;准备都做好了,下面我们只要把这个事件冒泡成为Login的控件的就行了。其实很简单的。只要重写一个方

法就行了。

如下:

Code
 1 protected override bool OnBubbleEvent(object source, EventArgs args)
 2         {
 3             bool handled = false;
 4 
 5             CommandEventArgs ce = args as CommandEventArgs;
 6             if (ce != null && ce.CommandName == "Validate")
 7             {
 8                 handled = true;
 9                 string userName = this.txtUserName.Text;
                 string userPassward = this.txtUserPassward.Text;
 
                 //把信息输入
                 ValidateEventArgs ve = new ValidateEventArgs(userName, userPassward);
                 OnValidateChanged(ve);
             }
             return handled;
         }

好了,完了,就这样了。

完整代码附上:

Code
  1 using System;
  2 using System.Collections.Generic;
  3 using System.Text;
  4 using System.Web;
  5 using System.Web.UI;
  6 using System.Web.UI.WebControls;
  7 using System.ComponentModel;
  8 
  9 namespace LoginControl
 10 {
 11     public class Login:CompositeControl
 12     {
 13         #region 要组合的控件
 14         Label lbUserName;
 15         Label lbUserPassward;
 16         TextBox txtUserName;
 17         TextBox txtUserPassward;
 18         Button submitButton;
 19         #endregion
 20        
 21 
 22         #region 重写方法CreateChildControls
 23 
 24         protected override void CreateChildControls()
 25         {
 26             Controls.Clear();
 27 
 28            //初始化控件lbUserName
 29             lbUserName = new Label();
 30             lbUserName.Text = "用户名:";
 31             lbUserName.ID = "lbUserName";
 32             //把控件添加到我们的组合控件中
 33             Controls.Add(lbUserName);
 34 
 35             //初始化控件lbUserPassward
 36             lbUserPassward = new Label();
 37             lbUserPassward.Text = "密  码:";
 38             lbUserPassward.ID = "lbUserPassward";
 39             Controls.Add(lbUserPassward);
 40            
 41 
 42             txtUserName = new TextBox();
 43             txtUserName.ID = "txtUserName";
 44             txtUserName.Width = Unit.Percentage();
 45             Controls.Add(txtUserName);
 46 
 47             txtUserPassward = new TextBox();
 48             txtUserPassward.ID = "txtUserPassward";
 49             txtUserPassward.Width = Unit.Percentage();
 50             Controls.Add(txtUserPassward);
 51 
 52             submitButton  = new Button();
 53             submitButton.Text = "提交";
 54             submitButton.CommandName = "Validate";
 55             Controls.Add(submitButton);
 56 
 57             ChildControlsCreated = true;
 58         }
 59         #endregion
 60         #region 将组合的子控件的属性 呈现为 组合控件的属性
 61 
 62         public string UserNameLabelText
 63         {
 64             get
 65             {
 66                 EnsureChildControls();
 67                 return lbUserName.Text;
 68             }
 69             set
 70             {
 71                 EnsureChildControls();
 72                 lbUserName.Text = value;
 73             }
 74         }
 75 
 76         public string UserPasswardLabelText
 77         {
 78             get
 79             {
 80                 EnsureChildControls();
 81                 return lbUserPassward.Text;
 82             }
 83             set
 84             {
 85                 EnsureChildControls();
 86                 lbUserPassward.Text = value;
 87             }
 88         }
 89 
 90         public string SubmitButtonText
 91         {
 92             get
 93             {
 94                 EnsureChildControls();
 95                 return submitButton.Text;
 96             }
 97             set
 98             {
 99                 EnsureChildControls();
                 submitButton.Text  = value;
             }
         }
 
 
         #endregion
 
         #region 组合控件呈现的样式
         protected override HtmlTextWriterTag TagKey
         {
             get
             {
                 return HtmlTextWriterTag.Table;
             }
         }
 
         protected override void RenderContents(HtmlTextWriter writer)
         {
 
             writer.RenderBeginTag(HtmlTextWriterTag.Tr);
 
             writer.RenderBeginTag(HtmlTextWriterTag.Td);
             lbUserName.RenderControl(writer);
             writer.RenderEndTag();//td的结束
 
             writer.RenderBeginTag(HtmlTextWriterTag.Td);
             txtUserName.RenderControl(writer);
             writer.RenderEndTag ();
 
             writer.RenderEndTag ();//tr的结束
 
             //***********************************************
 
             writer.RenderBeginTag(HtmlTextWriterTag.Tr);
 
             writer.RenderBeginTag(HtmlTextWriterTag.Td);
             lbUserPassward .RenderControl(writer);
             writer.RenderEndTag();//td的结束
 
             writer.RenderBeginTag(HtmlTextWriterTag.Td);
             txtUserPassward .RenderControl(writer);
             writer.RenderEndTag();
 
             writer.RenderEndTag ();//tr的结束
            
             //***********************************************
 
             writer.RenderBeginTag(HtmlTextWriterTag.Tr);
 
             writer.AddAttribute(HtmlTextWriterAttribute.Colspan, "");
             writer.AddAttribute(HtmlTextWriterAttribute.Align, "center");
             writer.RenderBeginTag(HtmlTextWriterTag.Td);
             submitButton.RenderControl(writer);
             writer.RenderEndTag ();
 
             writer.RenderEndTag();//tr的结束
 
                       
 
 
         }
         #endregion
          
         #region 事件
         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);
         }
     
         #endregion
 
         #region 冒泡
 
         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;
         }
         #endregion
 
 
 
     }
 }
 

ASP.NET自定义控件组件开发 第四章 组合控件开发CompositeControl 后篇 --事件冒泡的更多相关文章

  1. ASP.NET自定义控件组件开发 第四章 组合控件开发CompositeControl

    原文:ASP.NET自定义控件组件开发 第四章 组合控件开发CompositeControl 第四章 组合控件开发CompositeControl 大家好,今天我们来实现一个自定义的控件,之前我们已经 ...

  2. ASP.NET自定义控件组件开发 第五章 模板控件开发

    原文:ASP.NET自定义控件组件开发 第五章 模板控件开发 第五章 模板控件开发 系列文章链接: ASP.NET自定义控件组件开发 第一章 待续 ASP.NET自定义控件组件开发 第一章 第二篇 接 ...

  3. ASP.NET自定义控件组件开发 第三章 为控件添加事件 前篇

    原文:ASP.NET自定义控件组件开发 第三章 为控件添加事件 前篇 第三章 为控件添加事件 好了,我们之前以前开发一个控件.而且也添加了属性,开发也很规范,但是那个控件还差最后一点:添加事件. 系列 ...

  4. ASP.NET自定义控件组件开发 第三章 为控件添加事件 后篇

    原文:ASP.NET自定义控件组件开发 第三章 为控件添加事件 后篇 第三章 为控件添加事件 后篇 前一篇文章只是简单的说了下事件,但是大家应该方法,在ASP.NET自定义控件中只是简单那么定义事件是 ...

  5. 『Asp.Net 组件』第一个 Asp.Net 服务器组件:自己的文本框控件

    代码: using System.Web; using System.Web.UI; using System.Web.UI.WebControls; namespace DemoWebControl ...

  6. Andriod 自定义控件之创建可以复用的组合控件

    前面已学习了一种自定义控件的实现,是Andriod 自定义控件之音频条,还没学习的同学可以学习下,学习了的同学也要去温习下,一定要自己完全的掌握了,再继续学习,贪多嚼不烂可不是好的学习方法,我们争取学 ...

  7. Android开发学习笔记-自定义组合控件的过程

    自定义组合控件的过程 1.自定义一个View 一般来说,继承相对布局,或者线性布局 ViewGroup:2.实现父类的构造方法.一般来说,需要在构造方法里初始化自定义的布局文件:3.根据一些需要或者需 ...

  8. 安全控件开发原理分析 支付宝安全控件开发 C++

    浏览器安全控件是如果支付宝一样结合web程序密码数据安全处理的程序,采用C++语言开发 通常的安全控件分为两种,一种是指支持IE内核的浏览器,一种支持所有内核的浏览器,支付宝采用的是支持所有内核的浏览 ...

  9. 【Android】13.0 UI开发(四)——列表控件RecyclerView的横向布局排列实现

    1.0 新建项目,由于ListView的局限性,RecyclerView是一种很好取代ListView的控件,可以灵活实现多种布局. 2.0 新建项目RecyclerviewTest,目录如下: 3. ...

随机推荐

  1. TMS320F28335项目开发记录5_28335之CCS编程基础

    CCS开发环境已经为我们封装好了很多片内外设寄存器的结构体,我们仅仅须要包括对应的官方的头文件就能够使用了,那么它的内部详细是怎样实现的呢? 以下来一个典型的样例: 1.使用结构体和联合体 A.用st ...

  2. Java学习之道:Java中十个常见的违规编码

    近期,我给Java项目做了一次代码清理工作.经过清理后,我发现一组常见的违规代码(指不规范的代码并不表示代码错误)反复出如今代码中.因此,我把常见的这些违规编码总结成一份列表,分享给大家以帮助Java ...

  3. unity3D的FingerGestures小工具

    夹 FingerGestures包结构 FingerGestures样例列表 设置场景 教程:识别一个轻敲手势 教程:手势识别器 教程:轻击手势识别器 教程:拖拽手势识别器 教程:滑动手势识别器 教程 ...

  4. H3C TE BGP拓扑排错报告

                                                                                       BGP排错报告 故障一:PPP链路 ...

  5. iOS UITableView的Section Footer加入button

    郝萌主倾心贡献,尊重作者的劳动成果.请勿转载. 假设文章对您有所帮助,欢迎给作者捐赠.支持郝萌主,捐赠数额任意.重在心意^_^ 我要捐赠: 点击捐赠 Cocos2d-X源代码下载:点我传送 在处理UI ...

  6. 道破Redis的VM

    原创文章是freas_1990.转载请注明出处:http://blog.csdn.net/freas_1990/article/details/42052813 Redis唯一的那个key的value ...

  7. 官方原版Windows XP SP3(VOL)中文简体版ISO下载

    今天,向各位朋友推荐今年五月,由MSDN官方集成的XP With SP3专业VOL版.    文 件:Windows XP Professional with Service Pack 3 (x86) ...

  8. error: png.h not found.

    跑php设备 --enable-mbstring --enable-ftp --enable-gd-native-ttf --with-openssl --enable-pcntl --enable- ...

  9. 我的学习笔记_Windows_HOOK计划 2009-12-03 11:19

    一.什么是HOOK? "hook"这个单词的意思是"钩子","Windows Hook"是Windows消息处理机制的一个重要扩展,程序猿能 ...

  10. UVa 11408 - Count DePrimes

    题目:一个数的素因子的和假设也是素数就叫做DePrimes,统计给定区间内的DePrimes. 分析:数论.本题使用用一种素数的筛法,欧拉筛法,也加线性筛法. 这样的方法,每次删选分两种情况:1.素因 ...