Изменение свойств элемента управления 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>
Другие вопросы по тегам