定制应用Repeater 、ListView的模版

若干年前有个需求:客户可在管理后台给每一个新闻内容栏目指定新闻的显示样式,有的能够显示新闻时间,有的则不须要。因而就有了动态模版的应用。记得当时是用 LoadControl 的方式而后 Controls.Add 实现的。最近又遇到了相似的需求,因而想到了能不能在服务端控件绑定前指定Template 便可?通过一番摸索,写下此文备忘。
通常使用 Template 方式有两种方式:Page.LoadTemplate 和实现 ITemplate 接口。
方法一:使用 LoadTemplate 的方式很简单,在调用 DataBind 方法前加载该模板便可,此方法和在页面上直接设置模版相似(详见 test0.aspx 示例)。this

protected void Page_Load(object sender, EventArgs e)
        {
            DataTable dt = data.DataSource();
            rpt_t0.ItemTemplate = this.LoadTemplate("wcTest0.ascx");
            rpt_t0.DataSource = dt;
            rpt_t0.DataBind();
        }

方法二:使用 ITemplate 的方式实现: ITemplate.InstantiateIn 只有一个参数 Control,如果给 Repeater 指定模版则此参数是 RepeaterItem 类型等(详见 test1.aspx 示例);在InstantiateIn里经过 container.Controls.Add 的方式输出 Html;orm

    public partial class wcTest1 : ITemplate
    {
        public DataTable Data { get; set; }

        public void InstantiateIn(Control container)
        {
            var data = container as RepeaterItem;
            if (null == data) return;

            int index = data.ItemIndex;

            var row = Data.Rows[index];

            Literal lit = new Literal();
            lit.Text = string.Format("<li>test {0},{1}</li>", row[0], row[1]);

            container.Controls.Add(lit);
        }
    }

  调用:blog

        protected void Page_Load(object sender, EventArgs e)
        {
            DataTable dt = data.DataSource();

            wcTest1 wt1 = new wcTest1();
            wt1.Data = dt;

            rpt_t1.ItemTemplate = wt1;

            rpt_t1.DataSource = dt;
            rpt_t1.DataBind();
        }

二者的利弊端比较:
一、使用方法一:可视化程度较好,符合通常使用习惯,修改时不用从新编译;
二、使用方法二:对于输出内容逻辑的控制力更强(固然能够经过定制模版文件的方式变通实现);接口

 

 示例下载get

相关文章
相关标签/搜索