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

Posted 事件

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 ASP.NET控件开发基础之复合控件事件处理浅析相关的知识,希望对你有一定的参考价值。

ASP.NET控件开发基础之复合控件事件处理浅析  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!

  上一篇写了ASP NET控件开发基础之复合控件基本的概念 这次就继续上次的话题 来学习ASP NET复合控件如何触发事件   对于ASP NET控件开发基础的学习首先我们先明白些内容

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

  ( ) 直接实现按钮事件

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

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

  void IPostBackEventHandler RaisePostBackEvent(string eventArgument)

  

  if (eventArgument == Previous )

  PreviousText = 你点击了PreviousText按钮 ;

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

  

  protected override void RenderContents(HtmlTextWriter writer)

  

  writer AddAttribute(HtmlTextWriterAttribute Onclick

  Page GetPostBackEventReference(this Previous ));

  writer RenderBeginTag(HtmlTextWriterTag Button);

  writer Write(this PreviousText);

  writer RenderEndTag();

  writer AddAttribute(HtmlTextWriterAttribute Onclick

  Page GetPostBackEventReference(this Next ));

  writer RenderBeginTag(HtmlTextWriterTag Button);

  writer Write(this NextText);

  writer RenderEndTag();

  

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

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

  

  OnClick(EventArgs Empty);

  

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

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

  Page GetPostBackEventReference方法用来传递参数

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

  小结:

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

  ( )以自定义事件实现

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

  ASP NET控件开发基础示例二

  void IPostBackEventHandler RaisePostBackEvent(string eventArgument)

  

  if (eventArgument == Previous )  OnClickPrevious(EventArgs Empty);

  else if

  (eventArgument == Next )

  OnClickNext(EventArgs Empty);

  

  调用代码如下

  protected void NavButtons _ _ClickPrevious(object sender EventArgs e)

  

  Label Text = 你点击了PreviousText按钮 ;

  

  protected void NavButtons _ _ClickNext(object sender EventArgs e)

  

  Label Text = 你点击了NextText按钮 ;

  

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

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

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

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

  ASP NET控件开发基础示例三

  ﹤%@ Page Language= C# %﹥ ﹤!DOCTYPE PUBLIC //W C//DTD XHTML Transitional//EN   transitional dtd ﹥

  ﹤script runat= server ﹥

  protected void Button _Click(object sender EventArgs e)

  

  Label Text = 你点击了左按钮 ;

  

  protected void Button _Click(object sender EventArgs e)

  

  Label Text = 你点击了右按钮 ;

  

  protected void btn_mand(object sender CommandEventArgs e)

  

  switch (e CommandName)

  

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

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

  

  

  protected void btn _mand(object sender CommandEventArgs e)

  

  switch (e CommandName)

  

  case left :  Button _Click(this e);

  break;

  case right :  Button _Click(this e);

  break;

  

  

  ﹤/script﹥

  ﹤ 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_mand /﹥

  ﹤asp:Button ID= Button runat= server Text= 右按钮 OnCommand= btn_mand 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 _mand /﹥

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

  ﹤/div﹥

  ﹤/form﹥

  ﹤/body﹥

  ﹤/﹥

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

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

   直接实现按钮事件

   以自定义事件实现

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

  ASP NET控件开发基础示例四

  namespace CompositionSampleControls

  

  public class Composition : Control INamingContainer

  

  public int Value

  

  get

  this EnsureChildControls();

  return Int Parse(((TextBox)Controls[ ]) Text);

  

  set

  

  this EnsureChildControls();

  ((TextBox)Controls[ ]) Text = value ToString();

  

  

  protected override void CreateChildControls()

  

  // Add Literal Control

  this Controls Add(new LiteralControl( ﹤h ﹥ + Value: ));

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

  box Text = ;  this Controls Add(box);

  // Add Literal Control   this Controls Add(new LiteralControl( ﹤/h ﹥ ));

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

  addButton Text = Add ;

  addButton Click += new EventHandler(this AddBtn_Click);

  this Controls Add(addButton);

  // Add Literal Control   this Controls Add(new LiteralControl( | ));

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

  subtractButton Text = Subtract ;  subtractButton Click += new EventHandler(this SubtractBtn_Click);

  this Controls Add(subtractButton);

  

  private void AddBtn_Click(Object sender EventArgs e)

  

  this Value++;

  

  private void SubtractBtn_Click(Object sender EventArgs e)

  

  this Value ;

  

  

  

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

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

   包含法

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

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

  ASP NET控件开发基础示例五

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

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

  

  Change(this e);

  

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

  private void AddBtn_Click(Object sender EventArgs e)

  

  this Value++; OnChange(EventArgs Empty);

  

   ASP NET复合控件事件冒泡法

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

  protected virtual bool OnBubbleEvent(     object source      EventArgs args  );

  protected void RaiseBubbleEvent(     object source      EventArgs args   );

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

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

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

  addButton Click += new EventHandler(this AddBtn_Click);

  protected override bool OnBubbleEvent(object source EventArgs e)

  

  bool handled = false;

  if (e is CommandEventArgs)

  

  CommandEventArgs ce = (CommandEventArgs)e;

  if (ce CommandName == Logon )

  

  OnLogon(EventArgs Empty);

  handled = true;

  

  

  return handled;

  

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

  protected virtual void OnCommand(CommandEventArgs e)

  

  CommandEventHandler handler = (CommandEventHandler)Events[EventCommand];

  if (handler != null)

  handler(this e);

  // The Command event is bubbled up the control hierarchy

  RaiseBubbleEvent(this e);

  

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

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

cha138/Article/program/net/201311/13502

相关参考

知识大全 ASP.NET模板控件开发浅析

ASP.NET模板控件开发浅析  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  ASPNET模板控

知识大全 Asp.net控件开发----控件开发基础

Asp.net控件开发----控件开发基础  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  服务器

知识大全 [ASP.NET开发系列]在用户控件中添加事件

[ASP.NET开发系列]在用户控件中添加事件  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  在

知识大全 ASP.NET中设计带事件定制控件

ASP.NET中设计带事件定制控件  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!在试图为客户开发一

知识大全 ASP.NET 2.0移动开发之列表控件

ASP.NET2.0移动开发之列表控件  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!概述  在很多

知识大全 控件开发asp.net处理标签间内容

  控件标签间的内容有的时候处理成节点有的时候处理成子控件如间的节点就会处理成属性Text的值而如Panel这样的控件则就是将其处理成子控件首先看如何处理成属性的  一处理成为属性  对于控件标签间的

知识大全 浅析五大ASP.NET数据控件

浅析五大ASP.NET数据控件  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  ASPNET中有不

知识大全 ASP.NET数据绑定控件比较浅析

ASP.NET数据绑定控件比较浅析  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  ASPNET数

知识大全 ASP.NET2.0中使用数据源控件之基础知识

ASP.NET2.0中使用数据源控件之基础知识  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!数据源

知识大全 ASP.NET服务器控件视图浅析

ASP.NET服务器控件视图浅析  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  ASPNET服务