控件回发系列一(IPostBackEventHandler)
MSDN:
定义 ASP.NET 服务器控件为处理回发事件而必须实现的方法。
命名空间:System.Web.UI
程序集:System.Web(在 system.web.dll 中)
语法:
public interface IPostBackEventHandler
公共方法:
RaisePostBackEvent:当由类实现时,使服务器控件能够处理将窗体发送到服务器时引发的事件。(要触发的事件都写在该方法中)
引言:我们经常发现,将一个Button按钮拖到aspx页面中,然后设置一下OnClick属性(onClick="Button1_Click"),浏览页面时,单击Button,自动回发,并且执行了后台代码:Button1_Click。当然不只是Button,其他诸如LinkButton、TextBox等都会自动回发处理相应事件,这是为什么?我们可以自己做出一个控件也能实现自动回发并且处理自己的事件吗?
我们可以看看Button类是怎么实现的:
public class Button : WebControl, IButtonControl, IPostBackEventHandler
看到了吧,IPostBackEventHandler接口,正是实现了这个接口才使得Button拥有了回发的功能,IPostBackEventHandler使我们看到了希望与曙光。
IPostBackEventHandler接口中有一个方法:void RaisePostBackEvent ( string eventArgument),eventArgument 表示要传递到事件处理程序的可选事件参数的 String。
msdn对于RaisePostBackEvent 的解释是:
该页将 eventArgument 参数的值传递给实现 IPostBackEventHandler接口的控件的 RaisePostBackEvent 方法。此控件还会呈现导致发生回发的 HTML 元素。如果控件呈现了用于回发的客户端脚本,则会在 eventArgument 参数中传递脚本中的参数。如果回发是由简单提交操作所引起的,则 eventArgument 参数为 空引用(在 Visual Basic 中为 Nothing)。
此方法为 HTML 和 Web 服务器控件实现的许多事件提供功能。
看看我的例子吧,会让你豁然开朗的。
自定义控件
namespace MyPostBackControlSet { public class MyPostBackControl : Control, IPostBackEventHandler { //申明Click事件委托 public event EventHandler Click; public MyPostBackControl() { // // TODO: Add constructor logic here // } //实现RaisePostBackEvent方法,处理回发事件 public void RaisePostBackEvent(string eventArgument) { OnClick(this, EventArgs.Empty); } //定义OnClick事件处理程序 protected void OnClick(Object sender, EventArgs e) { if (Click != null) { Click(this, e); } } protected override void Render(HtmlTextWriter writer) { writer.Write("<input type='submit' name='" + this.UniqueID + "' value='回发'/>"); } } }
页面调用代码
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default3.aspx.cs" Inherits="NewFolder1_Default3" %> <%@ Register Namespace="MyPostBackControlSet" TagPrefix="U1" %> <!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>Untitled Page</title> </head> <body> <form id="form1" runat="server"> <div> <U1:MyPostBackControl ID="MyPostBackControl1" runat="server" ></U1:MyPostBackControl> </div> </form> </body> </html>
页面效果:
点击按钮:
分析:
1、程序实现了IPostBackEventHandler接口,实现了RaisePostBackEvent函数.
2、回发时,系统便会调用RaisePostBackEvent中的内容.
3、执行自己的事件:执行自己写的OnClick方法。
综上:我们可以通过实现IPostBackEventHandler接口,处理服务器控件的回发事件。