ASP.NET 自定义控件学习研究
1. 学习当然要从最基本的练习HELLOWORLD开始啦。
下面我们就从最简单的示例说起:
using System; using System.Collections.Generic; using System.ComponentModel; using System.Linq; using System.Text; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; namespace Phillip.FAME.ServerControl { [DefaultProperty("Text")] [ToolboxData("<{0}:ServerControl1 runat=server></{0}:ServerControl1>")] public class ServerControl1 : WebControl { [Bindable(true)] [Category("Appearance")] [DefaultValue("")] [Localizable(true)] public string Text { get { String s = (String)ViewState["Text"]; return ((s == null) ? "[" + this.ID + "]" : s); } set { ViewState["Text"] = value; } } protected override void RenderContents(HtmlTextWriter output) { output.Write(Text); } } }
以上代码就是从VS中创建一个自定义服务器控件后,默认的状态。
从上面的示例可以看出,所有的ASP.NET控件继承与WEBCONTROL类,而示例也简单的显示了一个文本,该控件就像是一个 System.Web.UI.WebControls.Literal 控件一样。
其中我们注意到如何将文本显示到页面的呢?
关键在于我们重写了 WEBCONTROL方法的 RenderContents方法。
该方法将控件的内容呈现到指定的编写器中,HtmlTextWriter,表示要在客户端呈现 HTML 内容的输出流。
由此可以看到这个方法是用来最终定义输入HTML的内容的,所以在开发自定义控件时,一定要注意RenderContents是不是实现了你最终想的HTML输出。
根据这个提示,我们进入下一步:
2. 如何绑定数据到自定义的控件里呢?
比如我们经常会用到一些DROPDOwNLIST,经常需要绑定一些数据库的配置信息,这个时候,页面就需要每次重写哪些烦人的绑定操作。如果现在你学会了自定义控件,就不再那么麻烦了。
using System; using System.Collections.Generic; using System.ComponentModel; using System.Linq; using System.Text; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; namespace Phillip.FAME.ServerControl { [DefaultProperty("Text")] [ToolboxData("<{0}:TQBDropDownList runat=server></{0}:TQBDropDownList>")] public class TQBDropDownList : DropDownList { [Bindable(true)] [Category("Appearance")] [DefaultValue("")] [Localizable(true)] public Common.Enums.UserTypeEnum Types { get { Common.Enums.UserTypeEnum s = (Common.Enums.UserTypeEnum)ViewState["Types"]; return s; } set { ViewState["Types"] = value; } } protected override void OnPagePreLoad(object sender, EventArgs e) { if (Types == Common.Enums.UserTypeEnum.FirmAdmin) { System.Data.DataTable dt = new System.Data.DataTable(); //you can get data from your database. for (int i = 0; i < dt.Rows.Count; i++) { this.Items.Add(dt.Rows[i]["column"].ToString()); } } base.OnPagePreLoad(sender, e); this.DataBind(); } } }
上面的示例就是一个简单的从数据库读取数据,绑定到DROPDOWNLIST控件中的DEMO。从上面的示例可以很容易看到,最关键的步骤在于OnPagePreLoad方法,那么这里就要认真的考虑,为什么这里不是使用 RenderContents , 而是OnPagePreLoad方法了,原因就在于数据的绑定过程了。
因为DropdownList是继承自ListControls的,所以Items的定义在ListControls中,发现Items在RenderContents方法中被调用了,并且将其生成了最终的HTML代码option.
之前我们说过,RenderContents 是最终对数据的呈现,而我们这里要做的是数据的绑定,所以如果我们把绑定的过程写到这里,那么最终呈现数据时就会发现绑定的数据始终为空值了。