自定义控件(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
- 自定义控件(10)数据回传IPostBackDataHandler
- web组件设计,利用接口(IPostBackDataHandler)产生数据回传的问题
- web组件设计,利用接口(IPostBackDataHandler)产生数据回传的问题
- IPostBackDataHandler
- 自定义控件(数据绑定)
- 自定义控件的PostBack数据
- 自定义模拟数据加减控件
- 构建自定义控件之三——处理回传数据和事件
- IPostBackEventHandler 與 IPostBackDataHandler
- page在处理post请求时需要处理数据的加载IPostBackDataHandler和事件的触发IPostBackEventHandler.
- 自定义控件之事件回传
- 自定义控件(12)回传事件IPostBackEventHandler
- 自定义控件(11)回传事件原理
- 自定义控件(模板+数据绑定)
- ASP.NET数据控件的自定义模板
- 自定义服务器控件的元数据属性
- Repeater控件的自定义数据绑定
- 自定义服务器控件的元数据属性
- Element.classList属性
- Blockchain的鱼和熊掌系列(22) 之基于CUDA的客户端哈希并行化处理示例
- easyui-tree的json字符串结构(1层、2层、3层、4层)
- TP5.0.3-OUR中德双语网站的总结
- 【SQL】更新oracle数据库中的时间为表中当前时间之前的一个小时,5个小时
- 自定义控件(10)数据回传IPostBackDataHandler
- win10共享文件
- poj2104 K-th Number
- 阻止默认事件行为和事件冒泡
- 多个input文字方框中,默认字体是灰色,,输入字时,字体变成黑色
- Centos7 can't connect ot Internet but IP & ssh from local works
- java数据类型
- 计算机视觉笔记(一) 初探计算机视觉
- (9)自定义对象:四种方式