zoukankan      html  css  js  c++  java
  • 客户端回传事件接口IPostBackEventHandler

    客户端回传事件接口IPostBackEventHandler
    要使控件捕获回发事件,控件必须实现System.Web.UI.IPostBackEventHandler 接口。此接口约定允许控件在服务器上引发事件来响应来自客户端的回发。IPostBackEventHandler接口包含一个方法。
    /// <summary>
    /// 获得本书更多内容,请看:
    /// http://blog.csdn.net/ChengKing/archive/2008/08/18/2792440.aspx
    /// </summary>
    public interface IPostBackEventHandler
    {
        void RaisePostBackEvent(string eventArgument);
    }
    参数eventArgument表示要传递到事件处理程序的可选事件参数,一般通过此参数可以确定不同的引发事件源,进而作不同的逻辑处理。在本章最后有个例子说明eventArgument参数用法。回发后,页框架就会搜索发送的内容,并确定发送的名称是否与实现IPostBackEventHandler的服务器控件的UniqueID对应。如果对应,页框架就会在该控件上调用RaisePostBackEvent方法(在引发更改事件后)。
    以下代码片段显示了在服务器上引发Click事件的RaisePostBackEvent实现:
    /// <summary>
    /// 获得本书更多内容,请看:
    /// http://blog.csdn.net/ChengKing/archive/2008/08/18/2792440.aspx
    /// </summary>
    public void RaisePostBackEvent(String eventArgument)
    {
        ButtonEventArgs e = new ButtonEventArgs(eventArgument);
        OnClick(this, e);
    }
    在该方法中主要完成调用OnClick(e)事件功能,其中包含两个参数:第一个参数为当前控件本身(即一般事件体中sender,类型一般为object);第二个参数e为ButtonEventArgs参数类型对象,是继承于System.EventArgs类实现的参数类,在该类中可以定义与代码逻辑相关的任意属性,作为事件体的参数。
    最后,RaisePostBackEvent需要被客户端引发才能够执行,下面是一段能够引发服务端事件的代码:
    /// <summary>
    /// 获得本书更多内容,请看:
    /// http://blog.csdn.net/ChengKing/archive/2008/08/18/2792440.aspx
    /// </summary>
    protected override void Render(HtmlTextWriter output)
    {
        output.Write("<INPUT TYPE=submit name=" + this.UniqueID +
            " Value='Click Me' />");   
    }
    这段代码输出一个HTML的button标签,并设置为提交类型。非常重要一点是,不要忘记设置其name属性,因为当回发后,页框架就会搜索发送的内容,并确定发送的名称是否与实现IPostBackEventHandler的服务器控件的UniqueID对应。如果对应,页框架就会在该控件上调用RaisePostBackEvent方法;反之,如果没有设置按钮的name值为UniqueID属性值,当单击按钮时页框架就不会引发该控件的RaisePostBackEvent方法,因为只有名称为UniqueID(服务器控件服务端ID)的按钮才会被注册为具有IPostBackEventHandler接口功能的控件。
    下面通过一个简单的完整例子,了解事件回发处理机制,代码如下:
    /// <summary>
    /// 获得本书更多内容,请看:
    /// http://blog.csdn.net/ChengKing/archive/2008/08/18/2792440.aspx
    /// </summary>
    [DefaultEvent("Click")]
    [ToolboxData("<{0}:PostBackEventControl runat=server></{0}:PostBackEventControl>")]
    public class PostBackEventControl : Control, IPostBackEventHandler
    {
        public event EventHandler Click;
        protected virtual void OnClick(EventArgs e)
        {
            if (Click != null)
            {
                Click(this, e);
            }
        }
        public void RaisePostBackEvent(string eventArgument)
        {
            OnClick(EventArgs.Empty);
        }
        protected override void Render(HtmlTextWriter output)
        {
            output.Write("<INPUT TYPE=submit name="+this.UniqueID+"Value='单击我'
            />");
        }
    }
    该控件内容比较简单,仅输出一个提交类型的按钮,由于这个按钮类型为submit,所以当单击按钮时,其本身已经可以提交事件到服务器,但仅仅这样主控件还不能够捕捉到该按钮事件。控件能够捕捉处理该事件需要具备两个条件:第一,主控件继承了IPostBackEventHandler接口以及实现了RaisePostBackEvent方法;第二,必须有name值为UniqueID的客户端标签,页框架只认识控件的name属性。只有这两个条件同时具备才能够使控件具备捕捉并处理事件的机会。
    语句[DefaultEvent("Click")]的功能是定义Click事件为默认事件。通常把最常用的一个事件定义为默认事件,如果定义了默认事件,在设计器中双击控件时系统会自动从源代码视图(*.aspx)切换到后面代码(*.cs)页面,并可以自动注册默认事件;否则,仅切换到后台代码,但不注册任何事件。
    类代码中最上面的一句:
    public event EventHandler Click;
    这条语句定义了一个委托事件。EventHandler是一个预定义的委托,专用于表示不生成数据的事件的事件处理程序方法。如果事件生成数据,则必须提供自定义事件数据类型,并且必须要么创建一个委托(其中第二个参数的类型为自定义类型),要么使用泛型EventHandler委托类并用自定义类型替代泛型类型参数。
    在5.1.1节讲过事件的意义及其完成的功能,即在一个类中执行另一个功能类的功能,要想执行另一个类中的某个功能方法,必定要在当前类中保留另一个方法的引用,委托和事件就是为实现此功能而出现的。委托类似于C++中的函数指针,它一般指向一个方法。这样,当调用本类中的委托就相当于调用了另一个类中的方法。
    若要将事件与处理事件的方法关联,请向事件添加委托的实例和委托事件实例,如:
    this.Button1.Click +=new EventHandler(Button1_Click);
    除非移除了该委托,否则每当发生该事件时就调用事件处理程序。
    另外,委托的应用比较广泛,还有更加复杂的应用,比如定义一个委托可以同时指向多个事件,即一个委托指定一个事件列表,当调用委托时可以执行一系列的事件。这里限于篇幅就不多讲了,更多关于事件委托概念请查看微软官方文档,那里面已经讲得很详细了。
    本文由《 庖丁解牛:纵向切入ASP.NET 3.5控件和组件开发技术》作者  郑健 提供

  • 相关阅读:
    SSH出现Connection refused错误
    Lisp经典算法
    Arch Linux下韩文重叠显示
    Vim在图形环境下全屏产生黑边
    Vim常用插件安装及配置方法
    Python中Scrapy框架元素选择器XPath的简单实例
    Manjaro下Steam无法启动
    GNOME禁用GDM中night-light功能
    Neovim中提示Error: Required vim compiled with +python
    Manjaro下带供电的USB Hub提示error -71
  • 原文地址:https://www.cnblogs.com/broadview/p/1428630.html
Copyright © 2011-2022 走看看