• 定制应用Repeater 、ListView的模版


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

    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;

        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);
            }
        }
    

      调用:

            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();
            }

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

     示例下载

  • 相关阅读:
    解决js跨域
    判断js对象类型
    闭包的理解
    this关键字
    js的数据类型
    多线程
    JavaEE之动态页面技术(JSP/EL/JSTL)
    JavaEE之HttpServletResponse
    JavaEE之HttpServletRequest
    JavaEE之会话技术Cookie&Session
  • 原文地址:https://www.cnblogs.com/infozero/p/3443041.html
Copyright © 2020-2023  润新知