我正在尝试在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;”作为代码!
答案 0 :(得分:0)
要实现项目模板中数据项的评估,您需要实际访问数据项。数据项由容器控件保存,因此第一步是将其强制转换为更具体的数据绑定项控件。如果ListView
为ListViewItem
:
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有所帮助,但也许这个答案对未来的求职者有帮助。