快速业务通道

庖丁解牛Asp.net3.5控件和组件开发技术系列—事件和数据回发机制(一)

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-05-20
his.Text = strNewValue;
     return true;
   }
   return false;
}

ASP.NET页框架跟踪所有对此方法调用返回true的服务器控件,然后对这些控件调用RaisePostDataChangedEvent方法。

如果LoadPostData方法最后返回的值为true(返回true或false是由我们自己决定的),则页框架会自动调用RaisePostDataChangedEvent方法,在该方法中我们可以自定义需要引发的事件。一个数据回发事件例子如下:

public virtual void RaisePostDataChangedEvent()
{
   OnTextValueChanged(EventArgs.Empty);
}

OnTextValueChanged是定义的文本框值变化的事件。

数据回发处理和数据回发事件就讲这些,最后再总结一下其要点步骤:

设置主控件的name值为UniqueID。

实现LoadPostData方法,处理自己的数据比较逻辑,返回布尔值。

实现RaisePostDataChangedEvent,在该方法加入自定义事件。如上面的OnTextValueChanged(EventArgs.Empty)。

如果LoadPostData方法返回true,页框架会自动调用RaisePostDataChangedEvent方法。

这一节主要讲解了定义原始控件(非复合控件,即通过重写TagKey,AddAttributes ToRender,Render等方法)的数据回发处理和数据回发事件。对于现成的子控件或开发组合控件时就没必要这么麻烦,基于此ASP.NET的 Page控件提供了处理机制,请看下面一节。

5.2.3.2 把控件注册为要进行回发处理的控件

如果要把某个控件注册为要进行回发处理的控件,则可以通过方法Page.Register RequiresPostBack实现,此方法仅有一个参数,表示要进行回发处理的控件的引用(不是控件的ID),类型为Control类。以下是一个应用例子:

TextBox tb = new TextBox();
protected void Page_PreRender(object sender, EventArgs e)
{
   this.Page.RegisterRequiresPostBack(tb);
}

很重要一点是:要注册的控件必须实现IPostBackDataHandler接口,否则将引发HttpException,如图5-2所示。

图5-2 Http Exception提示

当控件实现IPostBackDataHandler接口时,该接口将可以进行回发数据处理,并可以引发任何回发数据已更改的事件,而且必须要在页生命周期的Page_PreRender事件中或该事件之前向页注册当前控件为要进行数据回发处理的控件。

5.2.3.3 数据回发及引发回发事件示例

通过之前讲解,或许您对IPostBackDataHandler接口已经比较理解了,本节主要以一个数据回发控件KingTextBox为例,实践验证一下IPostBackDataHandler是否真的能够完成它的功能。该控件完成的功能跟ASP.NET文本框控件TextBox相同,也就是说我们要自己做一个TextBox控件,不但要显示文本,而且能够执行数据回发事件。此控件看似简单,而事实上看起来比较简单的非复合控件越抽象越不好理解。

首先,还是看一看KingTextBox的完整代码:

/// <summary>
/// 获得本书更多内容,请看:
/// http://blog.csdn.net/ChengKing/archive/2008/08/18/2792440.aspx
/// </summary>
[ToolboxData("<{0}:KingTextBox runat=server></{0}:KingTextBox>")]
public class KingTextBox : Control, IPostBackDataHandler
{
   public KingTextBox()
   {
   }
   public string Text
   {
     get
     {
       String s = (String)ViewState["Text"];
       return ((s == null) ? String.Empty : s);
     }

     set
     {
       ViewState["Text"] = value;
     }
   }
   protected override void Render(HtmlTextWriter writer)
   {
     StringBuilder sb = new StringBuilder();
     sb.Append(&q

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号