下面的链接以最基本的形式显示了一个列表视图复合控件,但是我似乎无法将其扩展到我想要做的事情。
我的列表视图有 1 个表行和 2 个字段。第一个字段包含 1 个元素,而第二个字段包含 2 个元素,如下所示。
<asp:ListView ID="lstArticle" runat="server">
<LayoutTemplate>
<table id="itemPlaceholder" runat="server">
</table>
</LayoutTemplate>
<ItemTemplate>
<div class="ctrlArticleList_rptStandardItem">
<table width="100%">
<tr>
<td valign="top" class="ctrlArticleList_firstColumnWidth">
<a href="<%# GetURL(Container.DataItem) %>">
<%# GetImage(Container.DataItem)%>
</a>
</td>
<td valign="top">
<span class="ctrlArticleList_title">
<a href="<%# GetURL(Container.DataItem) %>">
<%# DataBinder.Eval(Container.DataItem, "Title") %>
</a>
</span>
<span class="ctrlArticleList_date">
<%# convertToShortDate(DataBinder.Eval(Container.DataItem, "ActiveDate"))%>
</span>
<div class="ctrlArticleList_standFirst">
<%# DataBinder.Eval(Container.DataItem, "StandFirst")%>
</div>
</td>
</tr>
</table>
</div>
</ItemTemplate>
因此,要转换它,我必须将 ITemplate 的 InstantiateIn 方法用于布局模板和 ItemTemplate。使用 DataBinding 事件将数据绑定到项目模板。
我目前的问题是如何设置 ItemTemplate 类并绑定来自上述 ListView ItemTemplate 的值。这是我到目前为止所管理的:
private class LayoutTemplate : ITemplate
{
public void InstantiateIn(Control container)
{
var table = new HtmlGenericControl("table") { ID = "itemPlaceholder" };
container.Controls.Add(table);
}
}
private class ItemTemplate : ITemplate
{
public void InstantiateIn(Control container)
{
var tableRow = new HtmlGenericControl("tr");
//first field in row
var tableFieldImage = new HtmlGenericControl("td");
var imageLink = new HtmlGenericControl("a");
imageLink.ID = "imageLink";
tableRow.Controls.Add(imageLink);
// second field in row
var tableFieldTitle = new HtmlGenericControl("td");
var title = new HtmlGenericControl("a");
tableFieldTitle.Controls.Add(title);
tableRow.Controls.Add(tableFieldTitle);
//Bind the data with the controls
tableRow.DataBinding += BindData;
//add the controls to the container
container.Controls.Add(tableRow);
}
public void BindData(object sender, EventArgs e)
{
var container = (HtmlGenericControl)sender;
var dataItem = ((ListViewDataItem)container.NamingContainer).DataItem;
container.Controls.Add(new Literal() { Text = dataItem.ToString() });
}
在 ListView 中使用的代码中的函数之一只是作为示例:
public string GetURL(object objArticle)
{
ArticleItem articleItem = (ArticleItem)objArticle;
Article article = new Article(Guid.Empty, articleItem.ContentVersionID);
return GetArticleURL(article);
}
概括
我需要做什么才能将以下内容转换为复合控件:
GetURL(Container.DataItem) GetImage(Container.DataItem)
GetURL(Container.DataItem) DataBinder.Eval(Container.DataItem, "标题")
convertToShortDate(DataBinder.Eval(Container.DataItem, "ActiveDate"))
DataBinder.Eval(Container.DataItem, "StandFirst")