自定义控件(10)数据回传IPostBackDataHandler

来源:互联网 发布:linux的图形界面工具 编辑:程序博客网 时间:2024/06/06 00:26

所有实现了IPostBackDataHandler接口的控件都获得了从回传表单中获取心值的机会。

IpostBackDataHandler需要实现两个方法

(1)LoadPostData()         处理页面交过来的回传数据

(2)RaisePostDataChangedEvent()         如果LoadPostData()方法返回true,则此方法被调用,此方法通常用来触发控件的事件。


下面实现一个例子

控件代码

using System;using System.ComponentModel;using System.Web;using System.Web.UI;using System.Web.UI.WebControls;namespace kjlx.BLL.IPostBack{    [ParseChildren(true, "Text")]    //把控件内容设置为Text属性    [DefaultProperty("Text"),        //查看控件属性时,焦点为Text属性    DefaultEvent("TextChanged")]     //默认事件为TextChanged    public class IPostBackTest1 : WebControl, IPostBackDataHandler    {        private static object TextChangeEvent = new object();   //定义TextChangeEvent        protected override HtmlTextWriterTag TagKey        {            get { return HtmlTextWriterTag.Textarea; }        }        //Text属性        [Category("Appearance"),                                          //外观        PersistenceMode(PersistenceMode.EncodedInnerDefaultProperty),        //指定属性保存为控件的唯一内容,当属性为字符串类型而且是HTML编码时可以使用此值        DefaultValue("")]                                                    //默认值为""        public virtual string Text        {            get            {                if (ViewState["Text"] != null)                {                    return (string)ViewState["Text"];                }                return string.Empty;            }            set { ViewState["Text"] = value; }        }        /// <summary>        /// 声明事件        /// </summary>        [Category("Action")]        //行为        public event EventHandler myTextChanged        {            add            {                Events.AddHandler(TextChangeEvent, value);            }            remove            {                Events.RemoveHandler(TextChangeEvent, value);            }        }        /// <summary>        /// 给TextArea添加属性,如name是回传必须的属性        /// </summary>        /// <param name="writer"></param>        protected override void AddAttributesToRender(System.Web.UI.HtmlTextWriter writer)        {            base.AddAttributesToRender(writer);            if (Page != null)            {                Page.VerifyRenderingInServerForm(this);      //确保控件放置在HtmlForm控件中            }            writer.AddAttribute(HtmlTextWriterAttribute.Name, this.UniqueID);  //把UniqueID设置为控件的name属性,因为表单回传时需要用到name            if (!Enabled)            {                writer.AddAttribute(HtmlTextWriterAttribute.Disabled, "disabled");            }        }               /// <summary>        /// 处理页面交过来的回传数据        /// </summary>        /// <param name="postDataKey">回传数据在在回传表单时的键</param>        /// <param name="postCollection">回传表单中的所有值的集合</param>        /// <returns></returns>        public bool LoadPostData(string postDataKey, System.Collections.Specialized.NameValueCollection postCollection)        {                        string text = this.Text;            string text2 = postCollection[postDataKey];            if (!text.Equals(text2, StringComparison.Ordinal))            {                this.Text = text2;                return true;            }            return false;        }        /// <summary>        /// 给控件添加内容,否则回传后结果会清空        /// </summary>        /// <param name="writer"></param>        protected override void RenderContents(HtmlTextWriter writer)        {            //把html变为文本            HttpUtility.HtmlEncode(this.Text, writer);        }        /// <summary>        /// 如果LoadPostData()方法返回true,则次方法将被调用,次方法通常用来触发控件的事件        /// </summary>        public void RaisePostDataChangedEvent()        {            EventHandler handler = (EventHandler)Events[TextChangeEvent];            if (handler != null)            {                handler(this, EventArgs.Empty);            }        }    }}

html代码

    <cc1:IPostBackTest1 ID="IPostBackTest1" runat="server"         ontextchanged="IPostBackTest1_myTextChanged" ></cc1:IPostBackTest1>        <asp:Button ID="Button1" runat="server" Text="Button" />
后台代码

    protected void IPostBackTest1_myTextChanged(object sender, EventArgs e)    {        Response.Write(IPostBackTest1.Text);    }

实现功能:在页面上定义一个TextArea,如果TextArea内容改变,页面提交后在网页上输出TextArea的内容。TextArea没有提交页面的功能,所有添加Button用于提交页面。

显示结果


下面对代码进行分析

private static object TextChangeEvent = new object();   //定义TextChangeEvent
相当于定义了一个事件的键

 /// <summary>        /// 声明事件        /// </summary>        [Category("Action")]        //行为        public event EventHandler myTextChanged        {            add            {                Events.AddHandler(TextChangeEvent, value);            }            remove            {                Events.RemoveHandler(TextChangeEvent, value);            }        }

以上代码定义了myTextChanged事件属性

在后台定义了myTextChanged事件属性后,后把事件添加到Events集合中,根据键进行存取


Events是一个事件集合,根据键进行存取,像之前定义的myTextChanged

Events.AddHandler(TextChangeEvent,value);   TextChangeEvent是键,value是事件属性值        也可以写成Events[TextChangeEvent]=value

       /// <summary>        /// 给TextArea添加属性,如name是回传必须的属性        /// </summary>        /// <param name="writer"></param>        protected override void AddAttributesToRender(System.Web.UI.HtmlTextWriter writer)        {            base.AddAttributesToRender(writer);            if (Page != null)            {                Page.VerifyRenderingInServerForm(this);      //确保控件放置在HtmlForm控件中            }            writer.AddAttribute(HtmlTextWriterAttribute.Name, this.UniqueID);  //把UniqueID设置为控件的name属性,因为表单回传时需要用到name            if (!Enabled)            {                writer.AddAttribute(HtmlTextWriterAttribute.Disabled, "disabled");            }        }

要回传的控件必须包含在Form中,要有name值

 /// <summary>        /// 处理页面交过来的回传数据        /// </summary>        /// <param name="postDataKey">回传数据在在回传表单时的键</param>        /// <param name="postCollection">回传表单中的所有值的集合</param>        /// <returns></returns>        public bool LoadPostData(string postDataKey, System.Collections.Specialized.NameValueCollection postCollection)        {                        string text = this.Text;            string text2 = postCollection[postDataKey];            if (!text.Equals(text2, StringComparison.Ordinal))            {                this.Text = text2;                return true;            }            return false;        }
以上方法是对页面回传数据进行处理

首先对比值是否改变,如果是就把新值赋给Text,并执行RaisePostDataChangedEvent

        /// <summary>        /// 给控件添加内容,否则回传后结果会清空        /// </summary>        /// <param name="writer"></param>        protected override void RenderContents(HtmlTextWriter writer)        {            //把html变为文本            HttpUtility.HtmlEncode(this.Text, writer);        }
把Text作为控件的内容,否则你会发现控件内容始终为空



从这也可以看出,RenderContents是在LoadPostData方法之后执行

 /// <summary>        /// 如果LoadPostData()方法返回true,则次方法将被调用,次方法通常用来触发控件的事件        /// </summary>        public void RaisePostDataChangedEvent()        {            EventHandler handler = (EventHandler)Events[TextChangeEvent];            if (handler != null)            {                handler(this, EventArgs.Empty);            }        }
执行之前保存在Events中的TextChangeEvent事件

阅读全文
1 0