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究竟是做什么用的。

posted @ 2011-01-13 23:19  雁北飞  阅读(639)  评论(1编辑  收藏  举报