Изменение свойств элемента управления ASP.NET в элементе управления Repeater
Мой вопрос довольно прост. Вот что я имею для страницы aspx:
<ul>
<asp:Repeater runat="server" ID="linksList" OnItemDataBound="linksList_OnItemDataBound" >
<ItemTemplate>
<li><asp:HyperLink runat="server" ID="link" /></li>
</ItemTemplate>
</asp:Repeater>
</ul>
Я пытаюсь получить список гиперссылок с сервера SQL в список. Вот что я имею в коде:
protected void Page_Load(object sender, EventArgs e)
{
DataSet ds = Utilities.RunSelectQuery("SELECT *");
DataTable dt = ds.Tables[0];
linksList.DataSource = dt;
linksList.DataBind();
}
Как я могу изменить NavigateUrl
а также Text
свойства в asp:HyperLink
после того, как данные были связаны с Repeater
? Я хочу сделать это в коде позади, я могу заставить его работать, если я делаю это с помощью <%# Eval("URL") %>
на странице ASPX, но это своего рода против того, что ASP.NET все.
Изменить: это решение, которое сработало для меня благодаря womp:
protected void linksList_OnItemDataBound(object sender, RepeaterItemEventArgs e)
{
if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
{
DataRowView row = (DataRowView)e.Item.DataItem;
HyperLink link = (HyperLink)e.Item.FindControl("link");
link.Text = row["description"].ToString();
link.NavigateUrl = row["URL"].ToString();
}
}
2 ответа
На самом деле, использование синтаксиса Databinder в ваших шаблонах - отличный способ сделать это, я не уверен, что вы имеете в виду, что он "против всего, что такое ASP.Net".
Однако, если вы действительно хотите сделать это в коде, вы можете сделать это прямо в своем обработчике OnItemDataBound (который выглядит так, как будто вы создали). Что-то вроде этого (читай: не проверено) должно сработать:
void linksList_OnItemDataBound(object Sender, RepeaterItemEventArgs e)
{
if (e.Item.ItemType == ListItemType.Item
|| e.Item.ItemType == ListItemType.AlternatingItem) {
DataRow row = e.Item.DataItem as DataRow;
Hyperlink link = e.Item.FindControl("link"));
link.Text = row["URL"];
link.NavigateUrl = row["URL"];
}
}
}
Способ сделать это так же, как вы сказали. Выполнение этого в коде позади добавляет ненужную работу, если вы только хотите отобразить URL. Вы также хотели бы поместить теги в HeaderTemplate и FooterTemplate.
<asp:Repeater runat="server" ID="linksList" OnItemDataBound="linksList_OnItemDataBound" >
<HeaderTemplate><ul></HeaderTemplate>
<ItemTemplate>
<li><asp:HyperLink runat="server" ID="link" NavigateUrl='<%# Eval("url") %>' /></li>
</ItemTemplate>
<FooterTemplate></ul></FooterTemplate>
</asp:Repeater>