事件回發&數據回發

1.事件回發

Web 服务器控件创建的按钮的类型有三种:ButtonLinkButtonImageButton三个控件都继承IPostBackEventHandler接口

IPostBackEventHandler接口专门定义了处理回发事件的方法,说白了就是onclick事件,如果自定义控件需要处理回发事件,你就需要继承IPostBackEventHandler接口,然后实现接口的RaisePostBackEvent 方法,另外一个简单的方法就是直接继承Button控件就可以了.
RaisePostBackEvent方法用于处理窗体发送给服务器时引发的事件,方法中有一个参数eventArgument 表示要传递到事件处理程序的可选事件参数的 String
下面总结处理回发事件,必须要做的步骤
(1)继承并实现IPostBackEventHandler接口的RaisePostBackEvent方法
(2)为表单元素定义UniqueID,以与IPostBackEventHandler服务器控件的UniqueID相对应
相应实现代码如下
示例一


namespace CustomControls
{
    public class SuperButton1 : Control, IPostBackEventHandler
     {
        // 声明Click事件委托
        public event EventHandler Click;

        // 定义OnClick事件处理程序
        protected virtual void OnClick(EventArgs e)
         {
            if (Click != null)
             {
                Click(this, e);
            }
        }
        // 实现RaisePostBackEvent方法,处理回发事件
        public void RaisePostBackEvent(string eventArgument)
         {
            OnClick(EventArgs.Empty);
        }
        protected override void Render(HtmlTextWriter output)
         {
            output.Write("<INPUT TYPE=submit name=" + this.UniqueID +
               " Value='确定' />");
        }
    }
}

注:EventArgs.Empty表示没有事件数据的事件等同于EventArgs类的构造函数,等同于new EventArgs()

2.數據回發

     判断旧值和新值的比较(比较数据),如果发生变化,则引发事件,数据回发就是实现这样的事件

IPostBackDataHandler 接口定义 ASP.NET 服务器控件为自动加载回发数据而必须实现的方法。
LoadPostData 方法  根据服务器控件的状态由于回发而发生更改做出判断是否调用RaisePostDataChangedEvent 方法,返回true则调用(就是旧值和新值不同的时候)
RaisePostDataChangedEvent 方法用于引发任何更改事件
以下的例子实现了如同textboxTextChanged事件

postDataKey表示控件内部数据的关键值,postCollection表示所有传入名称值的集合,其采用索引的方式来访问 


using System;
using System.Web;
using System.Web.UI;
using System.Collections.Specialized;
using System.ComponentModel;

namespace CustomComponents
{
    [ToolboxData("<{0}:Textbox1 runat=server></{0}:Textbox1>"),
    DefaultProperty("Text")]
    
public class Textbox1 : Control, IPostBackDataHandler
    
{
        
public string Text
        
{
            
get
            
{
                object text = ViewState["Text"];
                if (text == null)
                    return string.Empty;
                else
                    return (string)text;
            }
            set
             {
                ViewState["Text"] = value;
            }
        }

        public bool LoadPostData(string postDataKey,
           NameValueCollection postCollection)
         {
            string postedValue = postCollection[postDataKey];
            //检查新旧数据
            if (!Text.Equals(postedValue))
             {
                Text = postedValue;
                return true;
                //自动调用RaisePostDataChangedEvent()
            }
            else
                return false;
            //不发生变化
        }
        public void RaisePostDataChangedEvent()
         {
            OnTextChanged(EventArgs.Empty);
        }
        protected virtual void OnTextChanged(EventArgs e)
         {
            if (TextChanged != null)
                TextChanged(this, e);
        }
        public event EventHandler TextChanged;
        override protected void Render(HtmlTextWriter writer)
         {
            
base.Render(writer);
            Page.VerifyRenderingInServerForm(
this);
            writer.Write("<INPUT type=/"text/" name=/"");
            writer.Write(
this.UniqueID);
            writer.Write("/" value=/"" + 
this.Text + "/" />");
        }
    }
}

 

 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值