您所在的位置: 程序员家园 -> 家园博客 ->
 
在哪里摔倒
就在哪里自己爬起来

用户登录

查  找

最新评论

最新留言

常用网站

网易邮箱 GMAIL  

百度搜索 MSDN

霏凡软件 BT精品

影视帝国 射 手 网

电驴下载 全 库 网

友情连接

茄菲的窝 冰冰博客

枫叶飘零 玫  瑰

ACEN 云 豹 子

统  计



[cc]4.2.2捕获回传事件的实现
狼子 发表于 2007-6-3 22:47:00 阅读全文 | 回复(1) | 引用通告 | 编辑

P50 4.2.2捕获回传事件的实现

在WebCustomControl类中,实现了以下有关捕获回传事件处理的关键内容:

·控件类必须实现IPostBackEventHandler

·为引发控件回传的表单元素定义控件的UniqueID

·应用事件属性结构,维护事件处理程序委托列表

·在RaisePostBackEvent方法中调用OnClick方法

下面是P50的例子,新建项目HyperTextControl,修改默认文件名为WebCustomControl.cs

using System;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.ComponentModel;

namespace HyperTextControl
{
    [
    DefaultEvent("Click"),
    ToolboxData("<{0}:WebCustomControl runat=server></{0}:WebCustomControl")
    ]
    /*
     * P47 如果服务器控件需要捕获来自客户端的回传事件,并想为该回传事件自定义服务器端事件处理逻辑,那么控件必须实现System.Web.UI.IPostBackEventHandler接口。
     * 该接口只包括一个RaisePostBackEvent方法
     *
     * 《C#与.net Framework实战演练》P215 类必需实现所有继承下来的接口的所有接口方法,不允许只实现部分方法。
     *
     * 这里是声明 WebCustomControl 是继承自WebControl类,和IPostBackEventHandler接口
     * 所以WebCustomControl必须实现IPostBackEventHandler接口的所有方法,就是RaisePostBackEvent方法
     */
    public class WebCustomControl : WebControl,IPostBackEventHandler
    {
        //P50 定义Click事件委托对象,由于每个事件仅创建一次,因此,需要声明为表态和只读的
        private static readonly object EventClick=new object();

        //开始定义一个事件
        //先指定显示在属性浏览器下方,属性的文字说明,再指定属性在属性浏览器中进行分组显示的类别是Action
        [
        Description("事件属性结构"),
        Category("Action")
        ]

        //定义事件Click
        public event EventHandler Click
        {
            add
            {
                Events.AddHandler(EventClick, value);
            }
            remove
            {
                Events.RemoveHandler(EventClick, value);
            }
        }

        //重写呈现控件的方法RenderContents
        //P48 当引发回传后,页框架就会搜索发送的内容,并确定发送的名称是否与实现IPostBackEventHandler的服务器控件的UniqueID对应。
        //如果对应,页框架就会在该控件上调用RaisePostBackEvent方法(在引发更改事件后)。
        protected override void RenderContents(HtmlTextWriter output)
        {
            //为控件的名称特性分配UniqueID
            output.Write("<input type=submit name=" + this.UniqueID + " value=请点击我 />");
        }

        //实现IPostBackEventHandler接口里的唯一一个方法
        public void RaisePostBackEvent(string eventArgument)
        {
            //P48 RaisePostBackEvent方法引发一个或者多个服务器端事件,这里是引发Click事件
            OnClick(EventArgs.Empty);
        }

        //P50 在OnClick方法的实现过程中,当用一个事件属性时,必须从EventHandlerList中取回委托,并将其转换成EventHandler类型。
        protected virtual void OnClick(EventArgs e)
        {
            EventHandler clickHandler = (EventHandler)Events[EventClick];
            if (clickHandler != null)
            {
                clickHandler(this, e);
            }
        }
    }
}

调用这个控件的aspx页面:

P52_PostbackEvent.aspx

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="P52_PostbackEvent.aspx.cs" Inherits="P52_PostbackEvent" %>
<%@ Register Assembly="HyperTextControl" Namespace="HyperTextControl" TagPrefix="cc1" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
    <title>无标题页</title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
        <cc1:webcustomcontrol id="WebCustomControl1" runat="server" onclick="WebCustomControl1_Click"></cc1:webcustomcontrol>
        <br /><br />
        <asp:Label ID="Label1" runat="server"></asp:Label></div>
    </form>
</body>
</html>

P52_PostbackEvent.aspx.cs

using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;

public partial class P52_PostbackEvent : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {

    }
    protected void WebCustomControl1_Click(object sender, EventArgs e)
    {
        Label1.Text = "点击了上面的控件";
    }
}

Re:[cc]4.2.2捕获回传事件的实现
mountain315发表评论于2007-6-4 19:54:00 个人主页 | 引用 | 返回 | 删除 | 回复

读P66,如果要加入简单的客户端功能,可以直接在这个例子里加入重写AddAttributesToRender方法

protected override void AddAttributesToRender(HtmlTextWriter writer)
        {
            base.AddAttributesToRender(writer);
            writer.AddAttribute("onclick", "return window.confirm('您激活了客户端处理程序,点是就提交');");
        }

发表评论:

    昵称:
    密码:
    主页:
    标题:
Powered by Oblog.