自定义控件(10)数据回传IPostBackDataHandler
2017-08-04 15:34
323 查看
所有实现了IPostBackDataHandler接口的控件都获得了从回传表单中获取心值的机会。
IpostBackDataHandler需要实现两个方法
(1)LoadPostData() 处理页面交过来的回传数据
(2)RaisePostDataChangedEvent() 如果LoadPostData()方法返回true,则此方法被调用,此方法通常用来触发控件的事件。
下面实现一个例子
控件代码
html代码
实现功能:在页面上定义一个TextArea,如果TextArea内容改变,页面提交后在网页上输出TextArea的内容。TextArea没有提交页面的功能,所有添加Button用于提交页面。
显示结果
下面对代码进行分析
以上代码定义了myTextChanged事件属性
在后台定义了myTextChanged事件属性后,后把事件添加到Events集合中,根据键进行存取
Events是一个事件集合,根据键进行存取,像之前定义的myTextChanged
Events.AddHandler(TextChangeEvent,value); TextChangeEvent是键,value是事件属性值 也可以写成Events[TextChangeEvent]=value
要回传的控件必须包含在Form中,要有name值
首先对比值是否改变,如果是就把新值赋给Text,并执行RaisePostDataChangedEvent
从这也可以看出,RenderContents是在LoadPostData方法之后执行
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.Verify 4000 RenderingInServerForm(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事件
相关文章推荐
- 服务器控件数据回发实现IPostBackDataHandler需注意的
- asp.net组件(7)数据回发 IPostBackDataHandler
- web组件设计,利用接口(IPostBackDataHandler)产生数据回传的问题
- 2 自定义控件之IPostBackDataHandler
- page在处理post请求时需要处理数据的加载IPostBackDataHandler和事件的触发IPostBackEventHandler.
- web组件设计,利用接口(IPostBackDataHandler)产生数据回传的问题
- [Joe 原创] Web Control 开发系列(二) 深入解析Page的PostBack过程和IPostBackDataHandler
- Web Control 开发系列(二) 深入解析Page的PostBack过程和IPostBackDataHandler
- Web Control 开发系列(二) 深入解析Page的PostBack过程和IPostBackDataHandler
- IPostBackDataHandler实现CollapablePanel控件的状态保持
- [Joe 原创] Web Control 开发系列(二) 深入解析Page的PostBack过程和IPostBackDataHandler
- Web Control 开发系列(二) 深入解析Page的PostBack过程和IPostBackDataHandler
- 组件开发之IPostBackDataHandler和OnLoad
- IPostBackDataHandler
- 【转】Web Control 开发系列(二) 深入解析Page的PostBack过程和IPostBackDataHandler
- IPostBackEventHandler 與 IPostBackDataHandler
- 自定义控件(12)回传事件IPostBackEventHandler
- 使用data()方法在元素上存取移除数据 10-4
- 数据挖掘:Top 10 Algorithms in Data Mining(二)K-Means算法
- 使用data()方法在元素上存取移除JSON格式数据 10-6