【问题标题】:add item template to listview with dynamic bindings asp.net使用动态绑定 asp.net 将项目模板添加到列表视图
【发布时间】:2025-12-06 10:45:01
【问题描述】:

我正在尝试在 ASP.NET 中实现动态列表视图。为此,应从 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();
 }

现在我还想为 listView 分配一个 itemTemplate。但我不知道如何将“" 实现为代码!

【问题讨论】:

    标签: c# asp.net listview


    【解决方案1】:

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

    ListViewItem item = (ListViewItem)container;
    

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

    item.DataItem
    

    要评估某些特定字段的值,请使用 DataBinder.Eval(这与 ASP.NET 在您编写 &lt;%# Eval() %&gt; 时实际使用的相同):

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

    上面的sn-p其实可以简化很多:

    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 有点晚了,但也许这个答案会对未来的求职者有所帮助。

    【讨论】:

    • 它有帮助,谢谢安德烈.. 现在,又过了 2 年.. 我有一个问题希望您能提供帮助。我正在使用相同的流程来创建 EditItem 模板,但在点击 Edit 按钮时出现错误:必须在 ListView 上指定项目占位符。任何通过后面的代码添加这个的建议都会很棒,谢谢!