博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

asp.net组件(5):控件的回发IPostBackEventHandler

Posted on 2007-12-18 22:54  a-peng  阅读(675)  评论(0编辑  收藏  举报

事件处理以前是属于windows应用程序开发的.
现在web开发也具有了. 现在就来看看asp.net它是怎么做到的.

asp.net中的程序:
    往窗体中拉入一个Button控件
    双击一下它,为其添加单击事件响应
    //this.Button1.Click += new EventHandler(Button1_Click)
    //由于用的是vs2005,所以我补上了上面一句,单击了Button1,触发了Clik事件
    //委托给Button1_Click这个函数来处理.EventHandler是.net中提供的默认委托.
    protected void Button1_Click(object sender, EventArgs e)
    {
       Response.Write("<script language='javascript'>alert('您单击了Button1');</script>");
    }
在服务端执行.
这种机制在以前asp中是不可想象的.

接着让我们看看asp中的处理

asp中的程序:
    <script language="javascript">
        function Button1_Click()
        {
            alert("您单击了Button1");
        }
    </script>
    <input type="button" name="Button1" onClick="Button1_Click" />
一切只能在客户端浏览器中进行.好失望噢!!!

asp.net中Button为什么会具有这种回发的功能呢?
在 SDK 中查找 Web Button控件可以看到
System.Object
   System.Web.UI.Control
      System.Web.UI.WebControls.WebControl
         System.Web.UI.WebControls.Button
public class Button : WebControl, IPostBackEventHandler
IPostBackEventHandler从名称可以猜出7,8分了吧.
对它就是让Button控件具有了回发功能.

该接口中含有void RaisePostBackEvent (string eventArgument);
这个函数用来处理回发事件,即回发就会触发它.
eventArgument 表示要传递到事件处理程序的可选事件参数的 String

现在让我们自己来实现一个具有此种功能的控件吧.

using System;
using System.Web.UI;

namespace WebComponent
{
    [ToolboxData(
@"<{0}:PostBackComponent runat='server'></{0}:PostBackComponent>")]
    
public class PostBackComponent : Control, IPostBackEventHandler
    
{
        
// 声明Click事件委托
        public event EventHandler Click;

        
// 定义OnClick事件处理程序
        protected void OnClick(Object sender, EventArgs e)
        
{
            
if (Click != null)
            
{
                Click(
this, e);
            }

        }


        
// 实现RaisePostBackEvent方法,处理回发事件
        public void RaisePostBackEvent(string eventArgument)
        
{
            OnClick(
this, EventArgs.Empty);
        }


        
protected override void Render(HtmlTextWriter writer)
        
{
            
writer.Write("<input type='submit' name='" + this.UniqueID + "' value='回发' />");
        }


    }

}

分析下这个控件:Render 绘制出了一个 html按钮
<input type="submit" name="PostBackComponent1" value="回发" />
点击这个html按钮 submit即提交表单发送到服务器.只要会动态编程的人应该都知道.

接下来有点特别:就是一般人我不告诉他.
发送到服务器,也可称之为回发,即回发到服务器嘛.
只要程序实现了IPostBackEventHandler接口实现了RaisePostBackEvent函数.
系统便会调用RaisePostBackEvent中的内容.

即OnClick(this,EventArgs.Empty);
接着只要Click事件不为空,就触发该事件.
触发后,当然就交给了该事件的委托函数去处理了啦.

噢对了,我们还没有委托呢?那接下来就来委托喽.
新建一个网页,拉入该控件.
protected void Page_Load(object sender, EventArgs e)
{
    //对该控件的Click事件进行委托给PostBackComponent1_Click函数处理
   
PostBackComponent1.Click += new EventHandler(PostBackComponent1_Click);
}

protected void PostBackComponent1_Click(object sender, EventArgs e)
{
   Response.Write("<script language='javascript'>alert('您单击了PostBackComponent1这个按钮');</script>");
}

编译:运行.点击按钮:弹出:您单击了PostBackComponent1这个按钮. 
程序按预期执行.

接下来,要干什么呢?当然是看一看没有回发时,和有回发时有什么区别了呀.
有什么区别呢?先预测一下.
有回发触发RaisePostBackEvent,没回发也就是没有触发该事件,也就是没有触发OnClick也就是没有触发Click
也就是 当你单击了按钮后没有弹出:您单击了PostBackComponet1这个按钮

那就实施一下吧.
注释掉 IPostBackEventHandler
    public class PostBackComponent : Control//, IPostBackEventHandler
结果按预期执行.