定製應用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

相關文章
相關標籤/搜索