您的位置:首页 > 编程语言 > ASP

ASP.NET自定义服务器控件 第4章 后篇

2012-09-12 16:19 330 查看
我们上一篇已经开发一个登录的组合控件,但是我们把控件的事件的这个问题没有解决,现在我们就来看看这个问题。
因为我们的组合控件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/


                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: