学习自定义web控件编程
2004-02-02 10:50
435 查看
要编写自定义web控件需继承System.Web.UI.Control,通过重写Render方法来呈现控件。无论多么复杂的web控件,其输出都是最基本的html元素,因此重写Render的关键是将web控件转化为html元素。Control类有一个可读写的ID属性,用来在服务器端唯一标识一个对象。Control类还有两个很重要的属性是ClientID和UniqueID,前者输出为html元素的id属性,后者输出为html元素的name属性。下面以一个自定义的TextBox作为说明,它实现了Text属性:
public class CustomTextBox : Control
{
private string _text;
public string Text
{
set{this._text = value;}
get{return this._text;}
}
protected override void Render(HtmlTextWriter writer)
{
writer.WriteBeginTag("input");
writer.WriteAttribute("name", this.UniqueID);
if(this.ID != null)
writer.WriteAttribute("id", this.ClientID);
writer.WriteAttribute("value", this.Text);
writer.Write(HtmlTextWriter.TagRightChar);
}
}
Render方法被asp.net调用,HtmlTextWriter对象由系统传入,以面向对象的方式输出html代码。
现在有两个问题需要解决:一是如何在回发后更新Text属性;二是如何实现TextBox控件的TextChanged事件。这需要通过实现IPostBackDataHandler的LoadPostData()方法和RaisePostDataChangedEvent()方法来实现。这两个方法都被asp.net来调用,前者用来读取用户在客户端用户对html元素输入的数据,如果LoasPostData()返回true的话,系统将调用RaisePostDataChangedEvent()。下面是添加的代码:
public bool LoadPostData(string postDataKey,
NameValueCollection postCollection)
{
string presentValue = this.Text;
this.Text = postCollection[postDataKey];
return (presentValue != this.Text);
}
public event EventHandler TextChanged;
public void RaisePostDataChangedEvent()
{
if(this.TextChanged != null)
this.TextChanged(this, new EventArgs());
}
以上的代码真的能够引发TextChanged事件么?能,一定能,即使用户未对html元素的值做任何改变都能在回发后引发TextChanged事件! 这是为什么呢?因为http是无状态的,http服务器面对的是来自若干客户端的访问请求,它是无法为同一客户的连续访问保存状态的。举例来说,客户A在第一次访问时将变量a设置为1,第2次访问的时候a的值不是1而应该是初始值。怎么办呢?答案是使用ViewState。ViewState是asp.net提供的一种在web服务器和客户端往返数据的机制。存储在ViewState中的数据被保存到客户端,客户端回发时再将这些数据返回给服务器,这样就可以将新的数据和历史数据进行对比了:
public string Text
{
set{this.ViewState["MyText"] = value;}
get{return (string)this.ViewState["MyText"];}
} protected bool _autoPostBack = false;
public bool AutoPostBack
{
set{this._autoPostBack = value;}
get{return this._autoPostBack;}
}
最后一个任务是实现AutoPostBack属性了。Asp.net为此提供了一个方法Page.GetPostBackEventReference(),它返回一段表示客户端事件的字符串,实际是一些客户端代码,只要在Render方法里插入下面的代码就行了,一个TextBox基本完成了!
if(this.AutoPostBack)
writer.WriteAttribute("onchange","javascript:" +
Page.GetPostBackEventReference(this));
public class CustomTextBox : Control
{
private string _text;
public string Text
{
set{this._text = value;}
get{return this._text;}
}
protected override void Render(HtmlTextWriter writer)
{
writer.WriteBeginTag("input");
writer.WriteAttribute("name", this.UniqueID);
if(this.ID != null)
writer.WriteAttribute("id", this.ClientID);
writer.WriteAttribute("value", this.Text);
writer.Write(HtmlTextWriter.TagRightChar);
}
}
Render方法被asp.net调用,HtmlTextWriter对象由系统传入,以面向对象的方式输出html代码。
现在有两个问题需要解决:一是如何在回发后更新Text属性;二是如何实现TextBox控件的TextChanged事件。这需要通过实现IPostBackDataHandler的LoadPostData()方法和RaisePostDataChangedEvent()方法来实现。这两个方法都被asp.net来调用,前者用来读取用户在客户端用户对html元素输入的数据,如果LoasPostData()返回true的话,系统将调用RaisePostDataChangedEvent()。下面是添加的代码:
public bool LoadPostData(string postDataKey,
NameValueCollection postCollection)
{
string presentValue = this.Text;
this.Text = postCollection[postDataKey];
return (presentValue != this.Text);
}
public event EventHandler TextChanged;
public void RaisePostDataChangedEvent()
{
if(this.TextChanged != null)
this.TextChanged(this, new EventArgs());
}
以上的代码真的能够引发TextChanged事件么?能,一定能,即使用户未对html元素的值做任何改变都能在回发后引发TextChanged事件! 这是为什么呢?因为http是无状态的,http服务器面对的是来自若干客户端的访问请求,它是无法为同一客户的连续访问保存状态的。举例来说,客户A在第一次访问时将变量a设置为1,第2次访问的时候a的值不是1而应该是初始值。怎么办呢?答案是使用ViewState。ViewState是asp.net提供的一种在web服务器和客户端往返数据的机制。存储在ViewState中的数据被保存到客户端,客户端回发时再将这些数据返回给服务器,这样就可以将新的数据和历史数据进行对比了:
public string Text
{
set{this.ViewState["MyText"] = value;}
get{return (string)this.ViewState["MyText"];}
} protected bool _autoPostBack = false;
public bool AutoPostBack
{
set{this._autoPostBack = value;}
get{return this._autoPostBack;}
}
最后一个任务是实现AutoPostBack属性了。Asp.net为此提供了一个方法Page.GetPostBackEventReference(),它返回一段表示客户端事件的字符串,实际是一些客户端代码,只要在Render方法里插入下面的代码就行了,一个TextBox基本完成了!
if(this.AutoPostBack)
writer.WriteAttribute("onchange","javascript:" +
Page.GetPostBackEventReference(this));
相关文章推荐
- [今日技术学习]利用ASP.NET 2.0创建自定义Web控件
- ASP.NET 3.5核心编程学习笔记(55):自定义扩展程序控件的创建
- 自定义Web控件学习
- ASP.NET 3.5核心编程学习笔记(6):Web控件
- web编程2--用户注册之日期控件,验证码
- 自定义Web上传控件设计
- DevExpress控件-WebchartControl的学习记录
- [原创]在ObjectDataSource中使用自定义Web控件提供查询参数
- Web开发:我希望得到的编程学习路线图
- 创建自定义控件学习
- 一步步学习SPD2010--第十四章节--在Web页面使用控件
- 一步步学习SPD2010--第十四章节--在Web页面使用控件(8)--关键点
- 【学习笔记】WebDriver操作第三方控件
- HTTP学习与Web服务器编程
- 第一天学习的总结(span,html控件,web控件,botton,随机数)
- 学习web编程的好网站
- Java Web 编程实践学习笔记 一
- Android 控件学习--自定义SeekBar
- 如何通过javascript操作web控件的自定义属性
- 在 VS2010 中发布自定义的 Web 控件 - 第二部分