ASP.NET自定义服务器控件 第4章 后篇
2012-09-12 16:19
330 查看
我们上一篇已经开发一个登录的组合控件,但是我们把控件的事件的这个问题没有解决,现在我们就来看看这个问题。
因为我们的组合控件Login是由一些已经存在的服务器控件的组合的,这样就省却了我们很多的麻烦,上篇中我们已经把子控件的一些属性,如Text等,显示呈现为了组合控件的属性。我们将之称为“属性的冒泡”(我自己这样认为的)。
我们现在来想下:其实我们点击“提交”按钮,我们就想把控件中信息发送给服务器,然后验证。即,我们点击的是“提交”按钮,但是触发的确实Login控件的验证事件。也就是说,我们应该把子控件-button的事件,上升冒泡成为Login的事件。
现在我们就正式讲讲怎么来事件冒泡。
对于事件的一些步骤,大家应该还记得:
1、定义一个数据类,用来当发生事件时,我们把一些信息携带。在本控件中,当我们点击“提交”按钮时,我们就把用户名和密码作为数据送到服务器。所以我们的数据类包含两个信息:如下:
因为我们的组合控件Login是由一些已经存在的服务器控件的组合的,这样就省却了我们很多的麻烦,上篇中我们已经把子控件的一些属性,如Text等,显示呈现为了组合控件的属性。我们将之称为“属性的冒泡”(我自己这样认为的)。
我们现在来想下:其实我们点击“提交”按钮,我们就想把控件中信息发送给服务器,然后验证。即,我们点击的是“提交”按钮,但是触发的确实Login控件的验证事件。也就是说,我们应该把子控件-button的事件,上升冒泡成为Login的事件。
现在我们就正式讲讲怎么来事件冒泡。
对于事件的一些步骤,大家应该还记得:
1、定义一个数据类,用来当发生事件时,我们把一些信息携带。在本控件中,当我们点击“提交”按钮时,我们就把用户名和密码作为数据送到服务器。所以我们的数据类包含两个信息:如下:
usingSystem; usingSystem.Collections.Generic; usingSystem.Text; namespaceLoginControl { publicclassValidateEventArgs:EventArgs { privatestringuserName; privatestringuserPassward; publicstringUserName { get { returnuserName; } } publicstringUserPassward { get { returnuserPassward; } } publicValidateEventArgs(stringusername,stringuserpassward) { this.userName=username; this.userPassward=userpassward; } } }
相信大家对上面的代码不陌生!!!
2、我们来定义一个委托: [code]publicdelegatevoidValidateEventHandler(objectsender,ValidateEventArgsargs);3、定义事件。
privatestaticreadonlyobjectValidateEventKey=newobject(); publiceventValidateEventHandlerValidateUserInfoChanged { add { Events.AddHandler(ValidateEventKey,value); } remove { Events.RemoveHandler(ValidateEventKey,value); } } protectedvirtualvoidOnValidateChanged(ValidateEventArgsargs) { ValidateEventHandlerhandler=Events[ValidateEventKey]asValidateEventHandler; if(handler!=null) handler(this,args); }
4、好了;准备都做好了,下面我们只要把这个事件冒泡成为Login的控件的就行了。其实很简单的。只要重写一个方法就行了。
如下: [code]protectedoverrideboolOnBubbleEvent(objectsource,EventArgsargs) { boolhandled=false; CommandEventArgsce=argsasCommandEventArgs; if(ce!=null&&ce.CommandName=="Validate") { handled=true; stringuserName=this.txtUserName.Text; stringuserPassward=this.txtUserPassward.Text; //把信息输入 ValidateEventArgsve=newValidateEventArgs(userName,userPassward); OnValidateChanged(ve); } returnhandled; }
好了,完了,就这样了。
完整代码附上:
usingSystem;
usingSystem.Collections.Generic;
usingSystem.Text;
usingSystem.Web.UI;
usingSystem.Web.UI.WebControls;
usingSystem.ComponentModel;
namespaceLoginControl
{
publicclassLogin2:CompositeControl
{
publicdelegatevoidValidateEventHandler(objectsender,ValidateEventArgsargs);
#region要组合的控件
LabellbUserName;
LabellbUserPassward;
TextBoxtxtUserName;
TextBoxtxtUserPassward;
ButtonsubmitButton;
#endregion
#region重写方法CreateChildControls
protectedoverridevoidCreateChildControls()
{
Controls.Clear();
//初始化控件lbUserName
lbUserName=newLabel();
lbUserName.Text="用户名:";
lbUserName.ID="lbUserName";
//把控件添加到我们的组合控件中
Controls.Add(lbUserName);
//初始化控件lbUserPassward
lbUserPassward=newLabel();
lbUserPassward.Text="密码:";
lbUserPassward.ID="lbUserPassward";
Controls.Add(lbUserPassward);
txtUserName=newTextBox();
txtUserName.ID="txtUserName";
txtUserName.Width=Unit.Point(150);
Controls.Add(txtUserName);
txtUserPassward=newTextBox();
txtUserPassward.ID="txtUserPassward";
txtUserPassward.Width=Unit.Point(150);
Controls.Add(txtUserPassward);
submitButton=newButton();
submitButton.Text="提交";
submitButton.CommandName="Validate";
Controls.Add(submitButton);
ChildControlsCreated=true;
}
#endregion
#region将组合的子控件的属性呈现为组合控件的属性
publicstringUserNameLabelText
{
get
{
EnsureChildControls();
returnlbUserName.Text;
}
set
{
EnsureChildControls();
lbUserName.Text=value;
}
}
publicstringUserPasswardLabelText
{
get
{
EnsureChildControls();
returnlbUserPassward.Text;
}
set
{
EnsureChildControls();
lbUserPassward.Text=value;
}
}
publicstringSubmitButtonText
{
get
{
EnsureChildControls();
returnsubmitButton.Text;
}
set
{
EnsureChildControls();
submitButton.Text=value;
}
}
#endregion
#region组合控件呈现的样式
protectedoverrideHtmlTextWriterTagTagKey
{
get
{
returnHtmlTextWriterTag.Table;
}
}
protectedoverridevoidRenderContents(HtmlTextWriterwriter)
{
writer.RenderBeginTag(HtmlTextWriterTag.Tr);
writer.RenderBeginTag(HtmlTextWriterTag.Td);
lbUserName.RenderControl(writer);
writer.RenderEndTag();//td的结束
writer.RenderBeginTag(HtmlTextWriterTag.Td);
txtUserName.RenderControl(writer);
writer.RenderEndTag();//td的结束
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();//td的结束
writer.RenderEndTag();//tr的结束
//***********************************************
writer.RenderBeginTag(HtmlTextWriterTag.Tr);
writer.AddAttribute(HtmlTextWriterAttribute.Colspan,"2");
writer.AddAttribute(HtmlTextWriterAttribute.Align,"center");
writer.RenderBeginTag(HtmlTextWriterTag.Td);
submitButton.RenderControl(writer);
writer.RenderEndTag();//td的结束
writer.RenderEndTag();//tr的结束
}
#endregion
#region事件
privatestaticreadonlyobjectValidateEventKey=newobject();
publiceventValidateEventHandlerValidateUserInfoChanged
{
add
{
Events.AddHandler(ValidateEventKey,value);
}
remove
{
Events.RemoveHandler(ValidateEventKey,value);
}
}
protectedvirtualvoidOnValidateChanged(ValidateEventArgsargs)
{
ValidateEventHandlerhandler=Events[ValidateEventKey]asValidateEventHandler;
if(handler!=null)
handler(this,args);
}
#endregion
#region冒泡
protectedoverrideboolOnBubbleEvent(objectsource,EventArgsargs)
{
boolhandled=false;
CommandEventArgsce=argsasCommandEventArgs;
if(ce!=null&&ce.CommandName=="Validate")
{
handled=true;
stringuserName=this.txtUserName.Text;
stringuserPassward=this.txtUserPassward.Text;
//把信息输入
ValidateEventArgsve=newValidateEventArgs(userName,userPassward);
OnValidateChanged(ve);
}
returnhandled;
}
#endregion
#regionIPostBackDataHandler成员
publicboolLoadPostData(stringpostDataKey,System.Collections.Specialized.NameValueCollectionpostCollection)
{
thrownewException("Themethodoroperationisnotimplemented.");
}
publicvoidRaisePostDataChangedEvent()
{
thrownewException("Themethodoroperationisnotimplemented.");
}
#endregion
}
}
好了,先到这里,下章介绍《模板控件开发》,继续开发……
更多事件冒泡可以参考:/article/4625080.html
转自:http://halesir.blog.163.com/blog/static/20461206920124136219779/
相关文章推荐
- .ASP.NET自定义服务器控件 第4章 组合控件开发CompositeControl
- asp.net 自定义服务器控件权威资料
- ASP.NET自定义Web服务器控件-TextBox文本框控件
- ASP.NET自定义服务器控件
- ASP.NET 自定义服务器控件的使用
- ASP.NET 2.0自定义服务器控件---事件冒泡
- ASP.NET - 如何:自定义 SiteMapPath Web 服务器控件的外观
- ASP.net 自定义服务器控件 TextBox
- ASP.NET服务器验证控件和JS自定义验证同时使用(小技巧)
- ASP.NET自定义服务器控件
- ASP.Net中保护自定义的服务器控件
- ASP.net 自定义服务器控件之 GridViewControl
- ASP.Net中保护自定义的服务器控件
- ASP.NET -自定义 TreeView Web 服务器控件的外观
- Asp.net自定义服务器控件开发小技巧: 如何正确获得回传数据
- ASP.NET中保护自定义的服务器控件
- asp.net 自定义服务器控件标签属性解释
- 如何开发自定义 ASP.NET 服务器控件
- Asp.net自定义服务器控件开发小技巧: 如何正确获得回传数据
- ASP.NET 自定义服务器控件