Dot-Net

如何在程式碼中定義列表視圖模板

  • October 1, 2014

我正在編寫一個複合控制項,其中包含一個列表視圖來顯示項目表。通常在 Asp.NET 中使用 ListView 時,我會在程式碼轉發中定義模板。

<asp:ListView runat="server" ID="ArticleList">
   <LayoutTemplate>
       <div class="ContentContainer">
           <div runat="server" id="itemPlaceholder" />
       </div>
   </LayoutTemplate>
   <ItemTemplate>
       <div>
           <div><%# Eval("Content") %></div>
       </div>
   </ItemTemplate>
   </asp:ListView>

我假設它是這樣的:

ListView view = new ListView();
view.LayoutTemplate = .....
view.ItemTemplate = .....

// when do I call these?
view.DataSource = myDataSource;
view.DataBind();

更新: 我通過實現 ITemplate 介面創建了 2 個模板:

private class LayoutTemplate : ITemplate
{
   public void InstantiateIn(Control container)
   {
       var outer = new HtmlGenericControl("div");
       var inner = new HtmlGenericControl("div") { ID = "itemPlaceholder" };
       table.Rows.Add(row);

       container.Controls.Add(table);
   }
}

private class ItemTemplate : ITemplate
{
   public void InstantiateIn(Control container)
   {
       var inner = new HtmlGenericControl("div");

       container.Controls.Add(inner);
   }
}

我可以使用以下方法添加它們:

dataList.LayoutTemplate = new LayoutTemplate();
dataList.ItemTemplate = new ItemTemplate();

但後來我卡住了,因為 container.DataItem 為空。

訣竅是在 ItemTemplate 中訂閱 itemplaceholder 的數據綁定事件。

完整的解決方案:

public class FibonacciControl : CompositeControl
{
   public FibonacciControl()
   {
       // ....
   }

   protected override void CreateChildControls()
   {
       base.CreateChildControls();

       ListView view = new ListView();

       view.LayoutTemplate = new LayoutTemplate();
       view.ItemTemplate = new ItemTemplate();

       view.DataSource = FibonacciSequence();
       view.DataBind();

       this.Controls.Add(view);
   }

   private IEnumerable<int> FibonacciSequence()
   {

       int i1 = 0;
       int i2 = 1;

       for (int i = 0; i < Iterations; i++)
       {
           yield return i1 + i2;
           int temp = i1 + i2;
           i1 = i2;
           i2 = temp;
       }
       yield break;
   }

   public int Iterations { get; set; }

   private class LayoutTemplate : ITemplate
   {

       public void InstantiateIn(Control container)
       {
           var ol = new HtmlGenericControl("ol");
           var li = new HtmlGenericControl("li") { ID = "itemPlaceholder" };
           ol.Controls.Add(li);

           container.Controls.Add(ol);
       }
   }

   private class ItemTemplate : ITemplate
   {
       public void InstantiateIn(Control container)
       {
           var li = new HtmlGenericControl("li");

           li.DataBinding += DataBinding;
           container.Controls.Add(li);
       }

       public void DataBinding(object sender, EventArgs e)
       {
           var container = (HtmlGenericControl)sender;
           var dataItem = ((ListViewDataItem)container.NamingContainer).DataItem;

           container.Controls.Add( new Literal(){Text = dataItem.ToString() });
       }
   }
}

引用自:https://stackoverflow.com/questions/92689