要捕捉回传的事件,要继承IPostBackEventHandler接口,这个接口只有一个方法RaisePostBackEvent
要处理回传数据,就要继承IPostBackDataHandler接口,这个接口有两个方法LoadPostData和RaisePostDataChangedEvent,如果LoadPostData返回true,.net框架将自动调用RaisePostDataChangedEvent
P54
LoadPostData方法是用来检查摬给服务器的数据的,包含两个参数:
postDataKey,表示用于识别控件内数据的关键值,postData是提交数据的集合,其采用Key/Value结构,便于使用索引名称访问。要访问集合中的控件数据,只要采用如下代码即可:"string nData = postData[postDataKey];"。
下面是P55的例子,创建一个自定义文本框控件MyTextBox,其文本属性因回发而更改,因为文本框是不会自动触发服务器端事件的,所以在MyTextBox里定义了TextChanged事件,也不会自动触发,所以书上原来的例子使用了一个服务器端控件Button帮助触发
我修改了一下,加入了js事件,使MyTextBox失去焦点时就自动提交表单回传数据
MyTextBox.cs
using System;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.ComponentModel;
using System.Collections.Specialized;
namespace HyperTextControl
{
[DefaultProperty("Text")]
[ToolboxData("<{0}:MyTextBox runat=server></{0}:MyTextBox>")]
/*
* 要处理回传的数据,就要继承IPostBackDataHandler接口
* 这个接口有两个方法LoadPostData和RaisePostDataChangedEvent
* 如果LoadPostData返回true,.net框架将自动调用RaisePostDataChangedEvent
*/
public class MyTextBox : WebControl,IPostBackDataHandler
{
//定义TextChanged委托对象
private static readonly object EventTextChanged = new object();
//加入设计时的控件特性
[Bindable(true)]
[Category("Appearance")]
[DefaultValue("")]
//视图状态管理
public string Text
{
get
{
String s = (String)ViewState["Text"];
return ((s == null) ? String.Empty : s);
}
set
{
ViewState["Text"] = value;
}
}
//呈现控件
protected override void Render(HtmlTextWriter writer)
{
//定义控件的属性
writer.AddAttribute(HtmlTextWriterAttribute.Type, "text");
writer.AddAttribute(HtmlTextWriterAttribute.Valign, this.Text);
writer.AddAttribute(HtmlTextWriterAttribute.Name, this.UniqueID);
//我加入这个属性,用于生成一个失去焦点就自动回传的js事件
writer.AddAttribute("onblur", "document.forms[0].submit();");
//呈现控件
writer.RenderBeginTag(HtmlTextWriterTag.Input);
writer.RenderEndTag();
}
#region IPostBackDataHandler 成员
public bool LoadPostData(string postDataKey, NameValueCollection postCollection)
{
//添加 MyTextBox.LoadPostData实现
string postedValue = postCollection[postDataKey];
string presentValue = Text;
if (presentValue == null || postedValue != presentValue)
{
Text = postedValue;
return true;
}
return false;
}
public void RaisePostDataChangedEvent()
{
//添加MyTextBox.RaisePostDataChangedEvent实现
OnTextChanged(EventArgs.Empty);
}
#endregion
//定义事件属性结构
public event EventHandler TextChanged
{
add
{
Events.AddHandler(EventTextChanged, value);
}
remove
{
Events.RemoveHandler(EventTextChanged, value);
}
}
//定义OnTextChanged方法
public void OnTextChanged(EventArgs e)
{
//先EventHandlerList中取回委托,将其转换成EventHandler类型,再使用
EventHandler textchangedHandler = (EventHandler)Events[EventTextChanged];
if (textchangedHandler != null)
{
textchangedHandler(this, e);
}
}
}
}
调用控件测试的页面,P55_PostBackData.aspx
P55_PostBackData.aspx.cs
using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
public partial class P55_PostBackData : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
}
protected void MyTextBox1_TextChanged(object sender, EventArgs e)
{
TextBox1.Text = MyTextBox1.Text;
}
}