ASP.NET自定义控件组件开发 第四章 组合控件开发CompositeControl 后篇 --事件冒泡
2009-04-24 11:52
465 查看
http://www.chinaitz.com/html/2009/0307/398751.html
我们上一篇已经开发一个登录的组合控件,但是我们把控件的事件的这个问题没有解决,现在我们就来看看这个问题。
因为我们的组合控件Login是由一些已经存在的服务器控件的组合的,这样就省却了我们很多的麻烦,上篇中我们已经把子控件的一些属性,如Text等,显示呈现为了组合控件的属性。我们将之称为“属性的冒泡”(我自己这样认为的)。
我们现在来想下:其实我们点击“提交”按钮,我们就想把控件中信息发送给服务器,然后验证。即,我们点击的是“提交”按钮,但是触发的确实Login控件的验证事件。也就是说,我们应该把子控件-button的事件,上升冒泡成为Login的事件。
现在我们就正式讲讲怎么来事件冒泡。
对于事件的一些步骤,大家应该还记得:
1。定义一个数据类,用来当发生事件时,我们把一些信息携带。在本控件中,当我们点击“提交”按钮时,我们就把用户名和密码作为数据送到服务器。所以我们的数据类包含两个信息:如下:
2.我们来定义一个委托:
3.定义事件。
4.好了;准备都做好了,下面我们只要把这个事件冒泡成为Login的控件的就行了。其实很简单的。只要重写一个方法就行了。
如下:
完整代码附上:
我们上一篇已经开发一个登录的组合控件,但是我们把控件的事件的这个问题没有解决,现在我们就来看看这个问题。
因为我们的组合控件Login是由一些已经存在的服务器控件的组合的,这样就省却了我们很多的麻烦,上篇中我们已经把子控件的一些属性,如Text等,显示呈现为了组合控件的属性。我们将之称为“属性的冒泡”(我自己这样认为的)。
我们现在来想下:其实我们点击“提交”按钮,我们就想把控件中信息发送给服务器,然后验证。即,我们点击的是“提交”按钮,但是触发的确实Login控件的验证事件。也就是说,我们应该把子控件-button的事件,上升冒泡成为Login的事件。
现在我们就正式讲讲怎么来事件冒泡。
对于事件的一些步骤,大家应该还记得:
1。定义一个数据类,用来当发生事件时,我们把一些信息携带。在本控件中,当我们点击“提交”按钮时,我们就把用户名和密码作为数据送到服务器。所以我们的数据类包含两个信息:如下:
1publicclassValidateEventArgs:EventArgs 2 { 3 privatestringuserName; 4 privatestringuserPassward; 5 6 publicstringUserName 7 { 8 get 9 { 10 return userName; 11 } 12 } 13 14 publicstringUserPassward 15 { 16 get 17 { 18 returnuserPassward; 19 } 20 } 21 22 publicValidateEventArgs(stringusername,stringuserpassward) 23 { 24 this.userName=username; 25 this.userPassward=userpassward; 26 } 27 }
相信大家对上面的代码不陌生!!!
2.我们来定义一个委托:
1publicdelegatevoidValidateEventHandler(objectsender,ValidateEventArgsargs);
3.定义事件。
1 privatestaticreadonlyobjectValidateEventKey=newobject(); 2 publiceventValidateEventHandlerValidateUserInfoChanged 3 { 4 add 5 { 6 Events.AddHandler(ValidateEventKey,value); 7 } 8 remove 9 { 10 Events.RemoveHandler(ValidateEventKey,value); 11 } 12 } 13 14 protectedvirtualvoidOnValidateChanged(ValidateEventArgsargs) 15 { 16 ValidateEventHandlerhandler=Events[ValidateEventKey]asValidateEventHandler; 17 if(handler!=null) 18 handler(this,args); 19 } 20
4.好了;准备都做好了,下面我们只要把这个事件冒泡成为Login的控件的就行了。其实很简单的。只要重写一个方法就行了。
如下:
1protectedoverrideboolOnBubbleEvent(objectsource,EventArgsargs) 2 { 3 boolhandled=false; 4 5 CommandEventArgsce=argsasCommandEventArgs; 6 if(ce!=null&&ce.CommandName=="Validate") 7 { 8 handled=true; 9 stringuserName=this.txtUserName.Text; 10 stringuserPassward=this.txtUserPassward.Text; 11 12 //把信息输入 13 ValidateEventArgsve=newValidateEventArgs(userName,userPassward); 14 OnValidateChanged(ve); 15 } 16 returnhandled; 17 }
好了,完了,就这样了。
完整代码附上:
1usingSystem; 2usingSystem.Collections.Generic; 3usingSystem.Text; 4usingSystem.Web; 5usingSystem.Web.UI; 6usingSystem.Web.UI.WebControls; 7usingSystem.ComponentModel; 8 9namespaceLoginControl 10{ 11 publicclassLogin:CompositeControl 12 { 13 #region要组合的控件 14 LabellbUserName; 15 LabellbUserPassward; 16 TextBoxtxtUserName; 17 TextBoxtxtUserPassward; 18 ButtonsubmitButton; 19 #endregion 20 21 22 #region重写方法CreateChildControls 23 24 protectedoverridevoidCreateChildControls() 25 { 26 Controls.Clear(); 27 28 //初始化控件lbUserName 29 lbUserName=newLabel(); 30 lbUserName.Text="用户名:"; 31 lbUserName.ID="lbUserName"; 32 //把控件添加到我们的组合控件中 33 Controls.Add(lbUserName); 34 35 //初始化控件lbUserPassward 36 lbUserPassward=newLabel(); 37 lbUserPassward.Text="密 码:"; 38 lbUserPassward.ID="lbUserPassward"; 39 Controls.Add(lbUserPassward); 40 41 42 txtUserName=newTextBox(); 43 txtUserName.ID="txtUserName"; 44 txtUserName.Width=Unit.Percentage(60); 45 Controls.Add(txtUserName); 46 47 txtUserPassward=newTextBox(); 48 txtUserPassward.ID="txtUserPassward"; 49 txtUserPassward.Width=Unit.Percentage(60); 50 Controls.Add(txtUserPassward); 51 52 submitButton =newButton(); 53 submitButton.Text="提交"; 54 submitButton.CommandName="Validate"; 55 Controls.Add(submitButton); 56 57 ChildControlsCreated=true; 58 } 59 #endregion 60 #region将组合的子控件的属性呈现为组合控件的属性 61 62 publicstringUserNameLabelText 63 { 64 get 65 { 66 EnsureChildControls(); 67 returnlbUserName.Text; 68 } 69 set 70 { 71 EnsureChildControls(); 72 lbUserName.Text=value; 73 } 74 } 75 76 publicstringUserPasswardLabelText 77 { 78 get 79 { 80 EnsureChildControls(); 81 returnlbUserPassward.Text; 82 } 83 set 84 { 85 EnsureChildControls(); 86 lbUserPassward.Text=value; 87 } 88 } 89 90 publicstringSubmitButtonText 91 { 92 get 93 { 94 EnsureChildControls(); 95 returnsubmitButton.Text; 96 } 97 set 98 { 99 EnsureChildControls(); 100 submitButton.Text =value; 101 } 102 } 103 104 105 #endregion 106 107 #region组合控件呈现的样式 108 protectedoverrideHtmlTextWriterTagTagKey 109 { 110 get 111 { 112 returnHtmlTextWriterTag.Table; 113 } 114 } 115 116 protectedoverridevoidRenderContents(HtmlTextWriterwriter) 117 { 118 119 writer.RenderBeginTag(HtmlTextWriterTag.Tr); 120 121 writer.RenderBeginTag(HtmlTextWriterTag.Td); 122 lbUserName.RenderControl(writer); 123 writer.RenderEndTag();//td的结束 124 125 writer.RenderBeginTag(HtmlTextWriterTag.Td); 126 txtUserName.RenderControl(writer); 127 writer.RenderEndTag(); 128 129 writer.RenderEndTag();//tr的结束 130 131 //*********************************************** 132 133 writer.RenderBeginTag(HtmlTextWriterTag.Tr); 134 135 writer.RenderBeginTag(HtmlTextWriterTag.Td); 136 lbUserPassward.RenderControl(writer); 137 writer.RenderEndTag();//td的结束 138 139 writer.RenderBeginTag(HtmlTextWriterTag.Td); 140 txtUserPassward.RenderControl(writer); 141 writer.RenderEndTag(); 142 143 writer.RenderEndTag();//tr的结束 144 145 //*********************************************** 146 147 writer.RenderBeginTag(HtmlTextWriterTag.Tr); 148 149 writer.AddAttribute(HtmlTextWriterAttribute.Colspan,"2"); 150 writer.AddAttribute(HtmlTextWriterAttribute.Align,"center"); 151 writer.RenderBeginTag(HtmlTextWriterTag.Td); 152 submitButton.RenderControl(writer); 153 writer.RenderEndTag(); 154 155 writer.RenderEndTag();//tr的结束 156 157 158 159 160 } 161 #endregion 162 163 #region事件 164 privatestaticreadonlyobjectValidateEventKey=newobject(); 165 publiceventValidateEventHandlerValidateUserInfoChanged 166 { 167 add 168 { 169 Events.AddHandler(ValidateEventKey,value); 170 } 171 remove 172 { 173 Events.RemoveHandler(ValidateEventKey,value); 174 } 175 } 176 177 protectedvirtualvoidOnValidateChanged(ValidateEventArgsargs) 178 { 179 ValidateEventHandlerhandler=Events[ValidateEventKey]asValidateEventHandler; 180 if(handler!=null) 181 handler(this,args); 182 } 183 184 #endregion 185 186 #region冒泡 187 188 protectedoverrideboolOnBubbleEvent(objectsource,EventArgsargs) 189 { 190 boolhandled=false; 191 192 CommandEventArgsce=argsasCommandEventArgs; 193 if(ce!=null&&ce.CommandName=="Validate") 194 { 195 handled=true; 196 stringuserName=this.txtUserName.Text; 197 stringuserPassward=this.txtUserPassward.Text; 198 199 //把信息输入 200 ValidateEventArgsve=newValidateEventArgs(userName,userPassward); 201 OnValidateChanged(ve); 202 } 203 returnhandled; 204 } 205 #endregion 206 207 208 209 } 210} 211
相关文章推荐
- ASP.NET自定义控件组件开发 第四章 组合控件开发CompositeControl 后篇 --事件冒泡
- ASP.NET自定义控件组件开发 第四章 组合控件开发CompositeControl 后篇 --事件冒泡
- ASP.NET自定义控件组件开发 第四章 组合控件开发CompositeControl 后篇 --事件冒泡
- ASP.NET自定义控件组件开发 第四章 组合控件开发CompositeControl
- ASP.NET自定义控件组件开发 第四章 组合控件开发CompositeControl
- ASP.NET自定义控件组件开发 第三章 为控件添加事件 前篇
- ASP.NET自定义控件组件开发 第三章 为控件添加事件 后篇
- ASP.NET自定义控件组件开发 第三章 为控件添加事件
- ASP.NET自定义控件组件开发 第三章 为控件添加事件 前篇
- ASP.NET自定义控件组件开发 第三章 为控件添加事件 前篇
- ASP.NET自定义控件组件开发 第三章 为控件添加事件 前篇
- asp.net控件开发基础(3) ----------自定义控件事件处理
- ASP.NET自定义控件组件开发 第五章 模板控件开发
- asp.net控件开发基础(3) ----------自定义控件事件处理
- asp.net控件开发基础(8) ----------在复合控件中中的事件处理(事件冒泡)
- ASP.NET自定义控件组件开发 第五章 模板控件开发
- ASP.NET自定义控件组件开发 第五章 模板控件开发
- 《纵向切入ASP.NET 3.5控件和组件开发技术》笔记:高效率事件集合对象
- ASP.NET组件与开发之复合控件的事件处理
- ASP.NET组件与开发之复合控件的事件处理