asp.net

位置:IT落伍者 >> asp.net >> 浏览文章

ASP.NET控件开发基础之复合控件事件处理浅析


发布日期:2023年03月04日
 
ASP.NET控件开发基础之复合控件事件处理浅析

上一篇写了ASPNET控件开发基础之复合控件基本的概念这次就继续上次的话题来学习ASPNET复合控件如何触发事件

对于ASPNET控件开发基础的学习首先我们先明白些内容

有一些ASPNET复合控件直接把按钮触发事件所需的事情封装好另外一种则是自定义事件更具灵活性当然这是根据需要设计的以下会以例子来说明的下面我们假设我们控件中有两个按钮以下不列出所有代码具体可在文章最后下载代码

() 直接实现按钮事件

在控件中(以下代码并非实现复合控件)直接实现事件则无需自定义事件如下代码(如果对数据回传有些不熟悉的话可先看第三篇希望对你有帮助)

ASPNET控件开发基础示例一(只列出局部代码具体可在文章最后下载代码)

void IPostBackEventHandlerRaisePostBackEvent(string eventArgument)

{

if (eventArgument == Previous)

PreviousText = 你点击了PreviousText按钮;

else if (eventArgument == Next) NextText = 你点击了NextText按钮;

}

protected override void RenderContents(HtmlTextWriter writer)

{

writerAddAttribute(HtmlTextWriterAttributeOnclick

PageGetPostBackEventReference(this Previous));

writerRenderBeginTag(HtmlTextWriterTagButton);

writerWrite(thisPreviousText);

writerRenderEndTag();

writerAddAttribute(HtmlTextWriterAttributeOnclick

PageGetPostBackEventReference(this Next));

writerRenderBeginTag(HtmlTextWriterTagButton);

writerWrite(thisNextText);

writerRenderEndTag();

}

还记得第三篇时示例一中下面的代码吗?此控件中只触发了一个事件所以无需根据服务器传递的参数来判断出发哪个事件

//实现RaisePostBackEvent方法处理回发事件 public void RaisePostBackEvent(string eventArgument)

{

OnClick(EventArgsEmpty);

}

RaisePostBackEvent方法有一个eventArgument参数用来传递事件数据代码实现了一个空参数传递(eventArgument参数为空)的事件OnClick(EventArgsEmpty)

再比较一下示例一的代码因为其用到了两个按钮

PageGetPostBackEventReference方法用来传递参数

RaisePostBackEvent方法则以传递参数来判断触发哪个按钮

小结:

在控件中直接实现按钮事件则无需定义自定义事件但别忘了在RaisePostBackEvent方法中根据传递过来的不同参数来加以判断

()以自定义事件实现

根据示例一上面的代码加上自定义委托和事件如下代码(只列出局部代码具体可在文章最后下载代码)

ASPNET控件开发基础示例二

void IPostBackEventHandlerRaisePostBackEvent(string eventArgument)

{

if (eventArgument == Previous) OnClickPrevious(EventArgsEmpty);

else if

(eventArgument == Next)

OnClickNext(EventArgsEmpty);

}

调用代码如下

protected void NavButtons__ClickPrevious(object sender EventArgs e)

{

LabelText = 你点击了PreviousText按钮;

}

protected void NavButtons__ClickNext(object sender EventArgs e)

{

LabelText = 你点击了NextText按钮;

}

小结:在示例一的基础上去除直接实现好的按钮事件然后自定义事件

再次提醒如果大家对回发事件还请再参考一些文章先弄清楚或者也可以看看我写的第三篇文章

好了上面讲的都非复合控件但复合控件实现起来却很相似或者可以说更加简单

下面先来看个简单的示例(大家知道button按钮有CommandName属性和CommandArgument属性)

ASPNET控件开发基础示例三

﹤%@ Page Language=C# %﹥ ﹤!DOCTYPE html PUBLIC //WC//DTD XHTML Transitional//EN transitionaldtd

﹤script runat=server

protected void Button_Click(object sender EventArgs e)

{

LabelText = 你点击了左按钮;

}

protected void Button_Click(object sender EventArgs e)

{

LabelText = 你点击了右按钮;

}

protected void btn_command(object sender CommandEventArgs e)

{

switch (eCommandName)

{

case left: LabelText = 你点击了左按钮;

break; case right: LabelText = 你点击了右按钮; break;

}

}

protected void btn_command(object sender CommandEventArgs e)

{

switch (eCommandName)

{

case left: Button_Click(this e);

break;

case right: Button_Click(this e);

break;

}

}

﹤/script﹥

﹤html xmlns=

﹤head runat=server

﹤title﹥无标题页﹤/title﹥

﹤/head﹥

﹤body﹥

﹤form id=form runat=server

﹤div﹥

﹤asp:Button ID=Button runat=server OnClick=Button_Click Text=左按钮 /﹥

﹤asp:Button ID=Button runat=server Text=右按钮 OnClick=Button_Click /﹥

﹤br /﹥

﹤br /﹥

﹤asp:Label ID=Label runat=server

﹤/asp:Label﹥

﹤br /﹥

﹤br /﹥

﹤asp:Button ID=Button runat=server Text=左按钮 CommandName=left OnCommand=btn_command /﹥

﹤asp:Button ID=Button runat=server Text=右按钮 OnCommand=btn_command CommandName=right /﹥

﹤br /﹥

﹤br /﹥

﹤asp:Label ID=Label runat=server

﹤/asp:Label﹥

﹤br /﹥

﹤br /﹥

﹤asp:Button ID=Button runat=server Text=左按钮 CommandName=left OnCommand=btn_command /﹥

﹤asp:Button ID=Button runat=server Text=右按钮 OnCommand=btn_command CommandName=right /﹥

﹤/div﹥

﹤/form﹥

﹤/body﹥

﹤/html﹥

以上代码以三种方式来实现按钮的触发事件这里本应该再举一个数据绑定控件如(DataList控件的使用)的一个例子的一个例子的这里目的只为了说明冒泡法的使用冒泡法在DataList等数据绑定控定控件中最能体现出来

那我们先来看下在ASPNET复合控件中怎么做?

直接实现按钮事件

以自定义事件实现

()以下为微软网站的示例代码如下代码

ASPNET控件开发基础示例四

namespace CompositionSampleControls

{

public class Composition : Control INamingContainer

{

public int Value

{

get {

thisEnsureChildControls();

return IntParse(((TextBox)Controls[])Text);

}

set

{

thisEnsureChildControls();

((TextBox)Controls[])Text = valueToString();

}

}

protected override void CreateChildControls()

{

// Add Literal Control

thisControlsAdd(new LiteralControl(﹤h + Value: ));

// Add Textbox TextBox box = new TextBox();

boxText = ; thisControlsAdd(box);

// Add Literal Control thisControlsAdd(new LiteralControl(﹤/h));

// Add Add Button Button addButton = new Button();

addButtonText = Add;

addButtonClick += new EventHandler(thisAddBtn_Click);

thisControlsAdd(addButton);

// Add Literal Control thisControlsAdd(new LiteralControl( | ));

// Add Subtract Button Button subtractButton = new Button();

subtractButtonText = Subtract; subtractButtonClick += new EventHandler(thisSubtractBtn_Click);

thisControlsAdd(subtractButton);

}

private void AddBtn_Click(Object sender EventArgs e)

{

thisValue++;

}

private void SubtractBtn_Click(Object sender EventArgs e)

{

thisValue;

}

}

}

因为内部事件已经实现好了所以比较简单相信大家都看的懂

再看复合控件的自定义事件这里才是我们所要讲的重点通常我们提倡在复合控件中采用冒泡法实现事件的上传上一篇已经说过了复合控件是一个树结构的控件最典型的就是的数据邦定控件(特殊的复合控件)了如DataList此控件有很多以Command结尾的事件我们刚开始学这个控件的时候总要考虑如何在此控件中实现按钮事件所采用的就是我们常说的事件冒泡当然还有另一种方法应该说是普通的实现方法服务器控件开发技术与示例称之为包含法下面我们以例子来说明上面两种方法

包含法

还是以微软的快速入门教程的代码为例与上面的代码对比有几处变动如下

注意粗体字自定义事件为复合控件顶层的事件而非其子控件button按钮的事件button按钮的事件需调用顶层事件处理程序即实现子控件事件上传的过程

ASPNET控件开发基础示例五

//自定义事件 public event EventHandler Change;

//自定义事件处理程序 protected void OnChange(EventArgs e)

{

Change(this e);

}

//子控件事件处理程序调用顶层事件处理程序此处需注意

private void AddBtn_Click(Object sender EventArgs e)

{

thisValue++; OnChange(EventArgsEmpty);

}

ASPNET复合控件事件冒泡法

上面已经介绍过了并且MSDN也已经作出了详细的解释控件可以将其定义的事件上传到控件顶层在引发事件时处理事件了解冒泡法你需要了解以下两个方法

protected virtual bool OnBubbleEvent( object source EventArgs args );

protected void RaiseBubbleEvent( object source EventArgs args );

RaiseBubbleEvent不可重写用于向上传递数据

要引发冒泡事件控件必重写 OnBubbleEvent 看OnBubbleEvent方法看下面代码

你需要先熟悉一下CommandEventArgs其为Command事件提供了数据通过其可以访问控件命令名称和参数并根据不同参数和名称触发不同事件其下代码为上一篇登录控件例子实现事件冒泡的方法具体代码可在最后下载且CreateChildControls方法中的触发事件的控件无须添加一个事件委托

addButtonClick += new EventHandler(thisAddBtn_Click);

protected override bool OnBubbleEvent(object source EventArgs e)

{

bool handled = false;

if (e is CommandEventArgs)

{

CommandEventArgs ce = (CommandEventArgs)e;

if (ceCommandName == Logon)

{

OnLogon(EventArgsEmpty);

handled = true;

}

}

return handled;

}

你也可以为控件定义的事件定义事件冒泡引发该时间则必须调用RaiseBubbleEvent示例三就是具体的例子使用

protected virtual void OnCommand(CommandEventArgs e)

{

CommandEventHandler handler = (CommandEventHandler)Events[EventCommand];

if (handler != null)

handler(thise);

// The Command event is bubbled up the control hierarchy

RaiseBubbleEvent(this e);

}

本次讲的重点在于冒泡法的使用但我却用很多篇幅介绍写前面的东西主要目的是为了让大家用复合控件与非符合控件进行比较总的来说复合控件为我们带来了便利不用实现IPostBackEventHandler接口简化了操作如果大家熟悉事件回传机制则不难了解冒泡法的使用最后还是要注意一点的是复合控件是一个树级的控件即由子控件组成的一个控件这次的例子很多都是直接取自书上和微软的教程上只供大家参考吧

好了这次就写到这里感觉这次写的并不是太好望见谅有错误请指出

ASPNET控件开发基础之复合控件事件处理的基本情况就向你介绍到这里希望对你理解ASPNET控件开发基础之复合控件事件有所帮助

               

上一篇:ASP.NET计算廿四节气

下一篇:优化ASP.NET应用程序性能研究与探讨