请读者注意:事件属性结构不适用于VB.NET语言,只能在C#等语言中应用。
2. 典型应用 实事求是的讲,以上捕获回传事件的理论介绍对于从未实现过服务器控件事件的读者而言,有些难以理解。为此,本小节通过一个典型的示例来具体说明捕获回传事件的实现方法。 本例实现了一个自定义服务器控件WebCustomControl。该控件虽然呈现为一个按钮外观,但是其并不是从Button类继承而来。当单击该按钮时,控件将引起回传,服务器端自动捕获回传的单击事件,并且引发Click事件,执行对应事件处理程序。下面是服务器控件实现的源代码代码:
using System;using System.Collections.Generic;using System.ComponentModel;using System.Text;using System.Web;using System.Web.UI;using System.Web.UI.WebControls;namespace WebControlLibrary{ [DefaultEvent("Click")] [ToolboxData("<{0}:WebCustomControl runat=server></{0}:WebCustomControl>")] public class WebCustomControl : WebControl, IPostBackEventHandler { // 定义一个Click事件委托对象 private static readonly object EventClick = new object(); //实现Click事件属性 [Description("Click事件属性"), Category("Action") ] public event EventHandler Click { add { Events.AddHandler(EventClick, value); } remove { Events.RemoveHandler(EventClick, value); } } // 重写控件呈现方法RenderContents protected override void RenderContents(HtmlTextWriter output) { output.Write("<input type='submit' name=" + this.UniqueID + " value=请单击 />"); } //实现事件方法 protected virtual void OnClick(EventArgs e) { EventHandler clickHandler = (EventHandler)Events[EventClick]; if (clickHandler != null) { clickHandler(this, e); } } // 实现IPostBackEventHandler接口成员 void IPostBackEventHandler.RaisePostBackEvent(string eventArgument) { OnClick(EventArgs.Empty); }}} 在WebCustomControl类中,实现了以下有关捕获回传事件处理的关键内容: ·控件类WebCustomControl实现IPostBackEventHandler; ·将引发回传的控件的name属性值设置UniqueID; ·实现事件属性结构,维护事件处理程序委托列表; ·在RaisePostBackEvent方法中调用OnClick方法; 下面的代码是应用自定义按钮WebCustomControl的Default.aspx源代码,显示效果如图1和图2所示。 <%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %><%@ Register TagPrefix="cc" Namespace="WebControlLibrary" Assembly="WebControlLibrary" %><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><script runat="server"> void wcc1_Click(object sender, EventArgs e) { message.Text = "您刚才点击了上面的按钮"; }</script><html xmlns="http://www.w3.org/1999/xhtml"><head runat="server"><title>捕获回传事件</title></head><body> <form id="form1" runat="server"> <center> <cc:WebCustomControl ID="wcc1" runat="server" OnClick="wcc1_Click" /> <br /> <br /> <asp:Label ID="message" runat="server"></asp:Label> </center></form></body></html> 下图1和图2是应用效果图。 图1 页面初始化效果图 图2 点击按钮后的效果图 另外,还有一个与捕获回传事件密切相关的属性AutoPostBack。该属性用于控件的自动回传设置,很多标准的服务器控件中均包含该属性。对于开发人员来讲,是否需要在自行创建的服务器控件中定义该属性是很重要的,需要根据控件的功能需求认真考虑取舍。该属性的关键代码实现如下: //定义属性AutoPostBackpublic bool AutoPostBack{ set { this._autoPostBack = value; } get { return this._autoPostBack; }}//在Render方法中添加Page.GetPostBackEventReference()方法protected override void Render(HtmlTextWriter output){ ...... if(this.AutoPostBack) { writer.WriteAttribute("ontextchanged","javascript:" + Page.GetPostBackEventReference(this)); } ......} 由以上代码可知,AutoPostBack属性的实现重点是Page.GetPostBackEventReference方法的应用。该方法获取对客户端脚本函数的引用,调用该函数将使服务器发送回该页,并返回一段表示客户端事件的字符串,实际是一些客户端代码。当AutoPostBack="true"时,服务器控件将发生自动回传,而不需通过Click事件等引发;当AutoPostBack="false",则回传必须经过类似Click的事件引发。 以上介绍的是有关捕获回传事件的具体实现方法。总体来讲不是非常复杂,然而,实现捕获回传事件的具体应用非常灵活,远远没有这么简单,这就需要读者不断的实践才能深入理解。 3. 小结 本文首先介绍了利用ASP.NET 2.0技术,为自定义服务器控件实现捕获回传事件的实现方法。通过这些内容,相信读者可以基本掌握实现控件捕获回传事件的方法。在随后的文章中,笔者将继续介绍实现事件处理的另一核心内容--处理回传数据。