Изменение свойств элемента управления ASP.NET в элементе управления Repeater - PullRequest
2 голосов
/ 08 августа 2009

Мой вопрос довольно прост. Вот что я имею для страницы 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 ]

4 голосов
/ 08 августа 2009

На самом деле, использование синтаксиса 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"];
             }
          }
       }   
1 голос
/ 08 августа 2009

Способ сделать это так же, как вы сказали. Выполнение этого в коде позади добавляет ненужную работу, если вы только хотите отобразить 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>
...