Ссылка ниже показывает составной элемент управления listview в его самой простой форме, однако я не могу расширить это до того, что я пытаюсь сделать.
Как определить шаблоны списка в коде
В моем списке просмотра есть 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>
Итак, чтобы преобразовать это, я должен использовать метод InstantiateIn ITemplate для шаблона layout и шаблона 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")