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
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 = "点击了上面的控件";
}
}
读P66,如果要加入简单的客户端功能,可以直接在这个例子里加入重写AddAttributesToRender方法
protected override void AddAttributesToRender(HtmlTextWriter writer)
{
base.AddAttributesToRender(writer);
writer.AddAttribute("onclick", "return window.confirm('您激活了客户端处理程序,点是就提交');");
}