使用动态绑定asp.net将项目模板添加到listview

时间:2013-12-03 07:58:34

标签: c# asp.net listview

我正在尝试在ASP.NET中实现动态listView。为此,列标题文本应该从List动态生成,并且数据应该绑定到List中的listView。列标题的动态生成一直有效。但我有问题将List绑定到listView。

到目前为止我所做的是以下内容:

aspx代码:

<asp:ListView ID="lvFriends" runat="server">

    <LayoutTemplate> <%-- generated dynamically --%>
    </LayoutTemplate>

    <ItemTemplate>
        <tr>
            <td id="itemTemplate">
                <%# Eval("Name")%>
            </td>
        </tr>
    </ItemTemplate>
</asp:ListView>
代码背后的代码:

private class LayoutTemplate : ITemplate
{
   public List<String> ColumnNames { get; set; }

   public LayoutTemplate ()
   {
       ColumnNames = new List<String>();
   }
   private class LayoutTemplate : ITemplate
   {
      ph.Controls.Add(new LiteralControl("<table>"));
      ph.Controls.Add(new LiteralControl("<tr>"));
      foreach (String columnName in ColumnNames)
      {
          ph.Controls.Add(new LiteralControl("<td>" + columnName + "</td>"));
      }
      ph.Controls.Add(new LiteralControl("</tr>"));
      ph.Controls.Add(new LiteralControl("<tr></tr>") { ID = "ItemPlaceholder" });
      ph.Controls.Add(new LiteralControl("</table>"));

      container.Controls.Add(ph);
    }
}

private class ItemTemplate : ITemplate
{
    public void InstantiateIn(Control container)
    {
        PlaceHolder ph = new PlaceHolder();

        ph.Controls.Add(new LiteralControl("<tr><td>")); 
        //ph.Controls.Add(<%# eval(\"Name\")%>));
        ph.Controls.Add(new LiteralControl("</tr></td>"));

        container.Controls.Add(ph);
    }
 }

 public class Friends
 {
     public string Name { get; set; }
 }

 protected void Page_Load(object sender, EventArgs e)
 {
     LayoutTemplate myTemplate = new LayoutTemplate();
     myTemplate.ColumnNames.Add("Name");
     myTemplate.ColumnNames.Add("Date");
     ...

     lvFriends.LayoutTemplate = myTemplate;

     //lvFriends.ItemTemplate = new ItemTemplate();

     List<Friends> dataList;
     dataList = getData();

     lvFriends.DataSource = dataList;
     lvFriends.DataBind();
 }

现在我想将itemTemplate分配给listView。但我不知道如何实现“&lt;%#eval(\”Name \“)%&gt;”作为代码!

1 个答案:

答案 0 :(得分:0)

要实现项目模板中数据项的评估,您需要实际访问数据项。数据项由容器控件保存,因此第一步是将其强制转换为更具体的数据绑定项控件。如果ListViewListViewItem

ListViewItem item = (ListViewItem)container;

现在数据项可以通过简单的方式获得:

item.DataItem

评估某些特定字段使用DataBinder.Eval的值(这与ASP.NET在编写<%# Eval() %>时实际使用的内容相同):

DataBinder.Eval(item.DataItem, "Name")

现在一切都很简单,只需生成必要的标记:

PlaceHolder ph = new PlaceHolder();
ph.Controls.Add(new LiteralControl("<tr><td>"));
ph.Controls.Add(new LiteralControl(DataBinder.Eval(item.DataItem, "Name") as string));
ph.Controls.Add(new LiteralControl("</td></tr>"));
item.Controls.Add(ph);

上面的代码段实际上可以简化很多:

LiteralControl itemMarkup =
    new LiteralControl("<tr><td>"
                        + (DataBinder.Eval(item.DataItem, "Name") as string)
                        + "</td></tr>");
item.Controls.Add(itemMarkup);

为了完整起见,整个ItemTemplate类:

public class ItemTemplate : ITemplate
{
    public void InstantiateIn(Control container)
    {
        ListViewItem item = (ListViewItem)container;

        LiteralControl itemMarkup =
            new LiteralControl("<tr><td>"
                                + (DataBinder.Eval(item.DataItem, "Name") as string)
                                + "</td></tr>");
        item.Controls.Add(itemMarkup);
    }
}

当然2年的时间对OP有所帮助,但也许这个答案对未来的求职者有帮助。