您的位置:首页 > 其它

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

2017-08-04 15:34 323 查看
所有实现了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.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事件
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: