zoukankan      html  css  js  c++  java
  • ASP.NET2.0服务器控件之捕获回传事件转载

    来源:http://www.jztop.com/dev/aspnet/2006-07-18/23200.html

      1. 实现捕获回传事件

      如果服务器控件需要捕获来自客户端的回传事件,并想为该回传事件自定义服务器端事件处理逻辑,那么控件必须实现System.Web.UI.IPostBackEventHandler接口。下面列举了该接口定义。

    public interface IPostBackEventHandler
    {
     void RaisePostBackEvent(string eventArgument);
    }

      如上代码所示,IPostBackEventHandler接口仅包括一个成员方法RaisePostBackEvent。该方法使服务器控件能够处理将窗体发送到服务器时引发的事件,其参数eventArgument表示要传递到事件处理程序的可选事件参数。开发人员可以在RaisePostBackEvent方法中实现服务器控件回传过程中执行的逻辑。一般情况下,RaisePostBackEvent方法将引发一个或者多个服务器端事件。以下代码片段显示了在服务器上引发Click事件的RaisePostBackEvent实现。

    public void RaisePostBackEvent(String eventArgument)
    {
     OnClick(EventArgs.Empty);
    }

      实现捕获回传事件并不是仅仅使服务器控件类实现IPostBackEventHandler接口,并实现该接口成员方法就可以的。开发人员还需要注意实现其他内容。下面列举了实现捕获回传事件过程中的三个要点。

      第一,也是最重要的,即自定义服务器控件类必须实现IPostBackEventHandler接口,并实现该接口成员RaisePostBackEvent方法。这一过程在上文中已经进行了介绍。

      第二,为控件分配UniqueID。

      定义引起回传事件的控件的name属性值为UniqueID,是正确实现RaisePostBackEvent方法的关键之一。当引发回传后,页框架就会搜索发送的内容,并确定发送对象的名称是否与实现IPostBackEventHandler的服务器控件的UniqueID对应。如果对应,页框架就会在该控件上调用RaisePostBackEvent方法。这里的重点是需要开发人员在呈现逻辑中,为控件的name属性分配UniqueID。下面列举了一个简单的代码示例。

    protected override void Render(HtmlTextWriter output)
    {
     output.Write("<INPUT TYPE=submit name="+this.UniqueID+"Value='Click Me' />");
    }

      如上代码所示,在控件呈现方法Render中,呈现了一个按钮,其name属性值为UniqueID。只有为引起回传的控件的name属性分配了UniqueID,才能够正确实现捕获回传事件。

      第三,实现事件属性结构。

      事件属性结构是一种优化的事件实现方式。在介绍之前,我们首先看看常见的控件事件实现方式。具体代码如下所示。

    ......
    public class WebCustomControl:WebControl,IPostBackEventHandler{
     //声明Click事件委托
     public event EventHandler Click;
     //实现RaisePostBackEvent方法
     void IPostBackEventHandler.RaisePostBackEvent(string eventArgument) {
      OnClick(EventArgs.Empty);
     }
     //定义OnClick事件处理程序
     protected virtual void OnClick(EventArgs e) {
      if(Click != null) { Click(this,e); }
     }
     ......
    }

      在以上代码中,包括了与事件定义相关的三个关键内容:一、定义Click事件委托;二、控件类实现了IPostBackEventHandler接口,其中当实现接口成员方法RaisePostBackEvent过程中,定义了事件处理程序OnClick;三、实现OnClick事件处理程序。以上实现方法简单易用,然而却存在一个缺点,即执行效率低。尤其是在一个类中引发多个事件的情况下,将会增加开销,浪费大量服务器资源,最终导致运行效率降低。

      为了解决以上问题,下面介绍一种优化的事件实现方式--事件属性结构。该结构使用System.ComponentModel.EventHandlerList类,这个类提供一个简单的委托列表。通过使用该类所提供的相关方法,开发人员能够灵活的操作控件的事件处理程序委托列表。例如,控件中的Click事件,使用事件属性结构如下:

    protected static readonly object EventClick = new object();
    public event EventHandler Click{
     add {
      Events.AddHandler(EventClick,value);
     }
     remove {
      Events.RemoveHandler(EventClick,value);
     }
    }

      在事件属性结构定义之前,首先需要定义Click事件委托对象。由于每个事件仅创建一次,因此,需要声明为静态和只读的。然后,在属性结构中通过AddHandler、RemoveHandler方法操作事件处理程序委托列表。当页面调用Click事件时,它向控件的EventHandlerList集合中添加或者删除处理程序。由于这种实现方法,在多个事件的声明过程中比普通的实现方法效率高,因此是非常值得推荐的方法。

      另外,在OnClick方法的实现过程中,当用一个事件属性时,必须从EventHandlerList中取回委托,并将其转换成EventHandler的类型。

    protected virtual void OnClick(EventArgs e){
     EventHandler clickHandler = (EventHandler)Events[EventClick];
     if(clickHandler != null) {
      clickHandler(this,e);
     }
    }

      请读者注意:事件属性结构不适用于VB.NET语言,只能在C#等语言中应用。
  • 相关阅读:
    TextureView获取RGBA
    直播预告 | 微软云:助力加速企业数字化转型
    安全无极限,防护向未来——Check Point 安全运维分享会
    数字未来·始物于行 荣之联IT赋能者峰会
    掌控安全 云领创新 —— 2018深信服亚太区巡展
    Dynatrace人工智能如何帮你更好管理云上运维
    Microsoft 365 DevDays
    买TOKENSKY区块链大会通证 豪送首尔一日游
    人工智能的背景下,物联网行业将面临怎样的发展趋势?
    走进四维图新,甲骨文红科技为智能汽车大脑赋能
  • 原文地址:https://www.cnblogs.com/llbofchina/p/457488.html
Copyright © 2011-2022 走看看