ASP.NET自定义控件组件开发 第四章 组合控件开发CompositeControl 后篇 --事件冒泡
原文:ASP.NET自定义控件组件开发 第四章 组合控件开发CompositeControl 后篇 --事件冒泡
CompositeControl 后篇 --事件冒泡
系列文章链接:
ASP.NET自定义控件组件开发 第二章 继承WebControl的自定义控件
ASP.NET自定义控件组件开发 第三章 为控件添加事件 前篇
ASP.NET自定义控件组件开发 第三章 为控件添加事件 后篇
ASP.NET自定义控件组件开发 第四章 组合控件开发CompositeControl
ASP.NET自定义控件组件开发 第四章 组合控件开发CompositeControl 后篇 --事件冒泡
我们上一篇已经开发一个登录的组合控件,但是我们把控件的事件的这个问题没有解决,现在我们就来看看这个
问题。
因为我们的组合控件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 后篇 --事件冒泡的更多相关文章
- ASP.NET自定义控件组件开发 第四章 组合控件开发CompositeControl
原文:ASP.NET自定义控件组件开发 第四章 组合控件开发CompositeControl 第四章 组合控件开发CompositeControl 大家好,今天我们来实现一个自定义的控件,之前我们已经 ...
- ASP.NET自定义控件组件开发 第五章 模板控件开发
原文:ASP.NET自定义控件组件开发 第五章 模板控件开发 第五章 模板控件开发 系列文章链接: ASP.NET自定义控件组件开发 第一章 待续 ASP.NET自定义控件组件开发 第一章 第二篇 接 ...
- ASP.NET自定义控件组件开发 第三章 为控件添加事件 前篇
原文:ASP.NET自定义控件组件开发 第三章 为控件添加事件 前篇 第三章 为控件添加事件 好了,我们之前以前开发一个控件.而且也添加了属性,开发也很规范,但是那个控件还差最后一点:添加事件. 系列 ...
- ASP.NET自定义控件组件开发 第三章 为控件添加事件 后篇
原文:ASP.NET自定义控件组件开发 第三章 为控件添加事件 后篇 第三章 为控件添加事件 后篇 前一篇文章只是简单的说了下事件,但是大家应该方法,在ASP.NET自定义控件中只是简单那么定义事件是 ...
- 『Asp.Net 组件』第一个 Asp.Net 服务器组件:自己的文本框控件
代码: using System.Web; using System.Web.UI; using System.Web.UI.WebControls; namespace DemoWebControl ...
- Andriod 自定义控件之创建可以复用的组合控件
前面已学习了一种自定义控件的实现,是Andriod 自定义控件之音频条,还没学习的同学可以学习下,学习了的同学也要去温习下,一定要自己完全的掌握了,再继续学习,贪多嚼不烂可不是好的学习方法,我们争取学 ...
- Android开发学习笔记-自定义组合控件的过程
自定义组合控件的过程 1.自定义一个View 一般来说,继承相对布局,或者线性布局 ViewGroup:2.实现父类的构造方法.一般来说,需要在构造方法里初始化自定义的布局文件:3.根据一些需要或者需 ...
- 安全控件开发原理分析 支付宝安全控件开发 C++
浏览器安全控件是如果支付宝一样结合web程序密码数据安全处理的程序,采用C++语言开发 通常的安全控件分为两种,一种是指支持IE内核的浏览器,一种支持所有内核的浏览器,支付宝采用的是支持所有内核的浏览 ...
- 【Android】13.0 UI开发(四)——列表控件RecyclerView的横向布局排列实现
1.0 新建项目,由于ListView的局限性,RecyclerView是一种很好取代ListView的控件,可以灵活实现多种布局. 2.0 新建项目RecyclerviewTest,目录如下: 3. ...
随机推荐
- Filter技术+职责链模式
Filter是一个过滤器,存在Webclient与请求的资源之间.这里的资源能够说是jsp或servlet.它的作用就是在请求达到资源之前,先对请求进行预处理.而且也能够对servlet处理后的res ...
- UFLDL教程笔记及练习答案二(预处理:主成分分析和白化)
首先将本节主要内容记录下来.然后给出课后习题的答案. 笔记: :首先我想推导用SVD求解PCA的合理性. PCA原理:如果样本数据X∈Rm×n.当中m是样本数量,n是样本的维数.PCA降维的目的就是为 ...
- SE 2014年5月5日
如图配置 某企业网络规划图(三台交换设备/三台路由设备) 接入层 SW1 连接终端用户 汇聚层 SW2 SW3 核心层 R1 R2 R5 1. 如图 SW1 SW2 SW3 物理链路两两相连接,网络中 ...
- Android 学习资源[转]
因为一些大家都知道的原因,android很多官方出品的优秀开发资源在国内无法访问. 国内的同行们对此也做出了很多努力,有很多朋友通过各种手段把很多优秀的资源搬运到了国内,为国内android开发者提供 ...
- 基于 Groovy 的自动化构建工具 Gradle 入门(转)
本人工作之初没有使用自动化构建,后来敏捷了,开始使用 Ant - 完全面向过程的定义步骤,不进行依赖管理.再发展到 Maven,面向对象的方式管理工程,有了依赖的管理,JAR 包统一从中央仓库获得,保 ...
- GString及IntelliJIdea中调试Groovy的操作步骤
今天是学习Groovy的第一天,首先我觉得学习任何一种语言都要先弄清楚这种语言的特性,因为只有了解了特性之后学习才能达到好的效果,那么groovy的特点是什么的.我觉得groovy是一种动态语言,动态 ...
- UVa 442 Matrix Chain Multiplication(矩阵链,模拟栈)
意甲冠军 由于矩阵乘法计算链表达的数量,需要的计算 后的电流等于行的矩阵的矩阵的列数 他们乘足够的人才 非法输出error 输入是严格合法的 即使仅仅有两个相乘也会用括号括起来 并且括号中 ...
- Web Worker在WebKit中的实现机制
web worker 是执行在后台的 JavaScript,独立于其它脚本.不会影响页面的性能.这是HTML5的一个标准:实现上讲.浏览器为wokrer启动了新的线程,从而实现了异步操作的功能; 以下 ...
- leetcode第一刷_Pow(x, n)
高速乘方的算法,写了好多变,出了各种错,真是服了我自己了. 思想是每次对n减半,将当前的temp平方.须要注意的是假设当前的n是个奇数,减半之后会丢失掉一次乘积,因此假设当前的n为奇数,应该先在结果里 ...
- 使用Visual Studio 2010 创建简单的Silverlight应用程序
使用Visual Studio 2010 创建简单的Silverlight应用程序 Silverlight是创建动态的引人的RIAs(Rich Internet Application)的新方法.这里 ...