TemplateWebControl
using System;
using System.ComponentModel;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
[ParseChildren(true), PersistChildren(false)]
public abstract class TemplatedWebControl : CompositeControl
{
//TODO:自定义模板控件的核心,由继承自这个类的类充当代理去加载各中皮肤,包括html,ascx等等
private ITemplate _skinTemplate;
private SmallStatusMessage smallStatus;
protected TemplatedWebControl()
{
}
//装入模板中的各个子控件
protected abstract void AttachChildControls();
//创建子控件
protected override void CreateChildControls()
{
this.Controls.Clear();
if (this.LoadSkinTemplate())
{
this.AttachChildControls();//自定义为抽象方法,供各个独自继承的子类去重写
}
}
public override void DataBind()
{
this.EnsureChildControls();
}
//根据控件id查找子控件
public override Control FindControl(string id)
{
Control control = base.FindControl(id);
if ((control == null) && (this.Controls.Count == 1))
{
control = this.Controls[0].FindControl(id);
}
return control;
}
//加载皮肤模板
protected virtual bool LoadSkinTemplate()
{
if (this.SkinTemplate != null)
{
this.SkinTemplate.InstantiateIn(this);//模板控件实例化一个控件
return true;
}
return false;
}
public override void RenderBeginTag(HtmlTextWriter writer)
{
}
public override void RenderEndTag(HtmlTextWriter writer)
{
}
protected virtual void ShowMessage(string msg, bool success)
{
this.smallStatus = (SmallStatusMessage) this.FindControl("Status");
if (this.smallStatus != null)
{
this.smallStatus.Success = success;
this.smallStatus.Text = msg;
this.smallStatus.Visible = true;
}
}
public override ControlCollection Controls
{
get
{
this.EnsureChildControls();//确定是否有子控件,如果有则创建子控件
return base.Controls;
}
}
public override System.Web.UI.Page Page
{
get
{
if (base.Page == null)
{
base.Page = HttpContext.Current.Handler as System.Web.UI.Page;
}
return base.Page;
}
set
{
base.Page = value;
}
}
[DefaultValue((string) null), PersistenceMode(PersistenceMode.InnerProperty), Browsable(false)]
public ITemplate SkinTemplate
{
get
{
return this._skinTemplate;
}
set
{
this._skinTemplate = value;
base.ChildControlsCreated = false;//说明子控件还没有被创建
}
}
}
关于这个类的备忘:
这是模板控件的基类。很多类都是AscxTemplateWebControl,HtmlTemplatedWebControl都是继承自这个类。
重要的方法和属性:AttachChildControl,附加子控件,就是将模板中的各个子控件附加到当前控件模板控件中,注意这个方法是虚方法,这是因为各个模板的子控件的数目和类型各部相同。因此由各个继承自该类的子类去重写该方法。
CreateChildControl创建子控件。
FindControl,根据子控件Id子控件。
重写的Page属性:获取加载当前模板控件的页面也就是Page类。
重写的Control属性:获取当前模板控件的所有子控件。注意在获取之前首先要确定这些子控件已经创建完毕。
接下来AscxTemplateWebControl,HtmlTemplatedWebControl分别继承这个类。
AscxTemplateWebControl:this.Page.LoadControl(this.SkinPath);用这个方法去加载用户自定义模板控件
HtmlTemplatedWebControl:this.Page.ParseControl(str);用这个方法去加载Html页面模板。
因此这边还有一个疑问未解决:就是TemplateWebControl的Itemplate究竟是做什么用的。