【问题标题】:Change an ASP.NET control's properties in a Repeater control在 Repeater 控件中更改 ASP.NET 控件的属性
【发布时间】:2010-11-17 21:12:06
【问题描述】:

我的问题很简单。这就是我的 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();
}

数据绑定到Repeater 后,如何更改asp:HyperLink 中的NavigateUrlText 属性?我想在代码隐藏中执行此操作,如果我在 aspx 页面中使用 &lt;%# Eval("URL") %&gt; 执行此操作,我可以让它工作,但这有点违背 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();
    }
}

【问题讨论】:

    标签: asp.net controls repeater code-behind pageload


    【解决方案1】:

    实际上,在模板中使用 Databinder syntax 是一种很好的方法,我不确定你的意思是“反对 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"];
                 }
              }
           }   
    

    【讨论】:

    • 啊,谢谢,这正是我所需要的。我需要知道如何执行代码隐藏方法的原因是因为我有更复杂的示例需要操作数据,而不是直接从 SQL 表中提取数据。我用正确实现的方法更新了我的原始帖子,你给我的几乎可以正常工作,只需要一些演员表。
    【解决方案2】:

    方法如你所说。如果您只想显示 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>
    

    【讨论】:

    • 将标签放在页眉和页脚模板中而不是放在外面有什么好处吗?我正在尝试使代码尽可能让 HTML 编码员阅读。
    • 是的,假设您将网格隐藏在代码后面,那么您将只有
        坐在那里。如果您的查询返回 0 条记录,您可能会隐藏网格。当你把
          放在你的 headertemplate 中时,它也会隐藏它。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-10-07
      • 1970-01-01
      • 1970-01-01
      • 2011-02-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多