下面的链接以最基本的形式显示了listview复合控件,但我似乎无法将其扩展到我想要做的事情。
How to define listview templates in code
我的listview有1个包含2个字段的tablerow。第一个字段包含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方法作为layouttemplate和ItemTemplate。使用DataBinding事件将数据绑定到itemtemplate。
我现在的问题是如何设置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,“Title”)
convertToShortDate(DataBinder.Eval(Container.DataItem,“ActiveDate”))
DataBinder.Eval(Container.DataItem,“StandFirst”)
答案 0 :(得分:0)
在您的控件中,您不需要生成&lt;%#binding;相反,您可以在服务器上获取绑定的URL并将其分配给链接,创建HyperLink并执行:
var link = new HyperLink();
link.NavigateUrl = GetUrl(dataItem);
link.ImageUrl = GetImage(dataItem);
dataItem是特定行的数据项,您可以在项模板binddata方法中获取,对吧?
我离开基地吗?
HTH。