如何以编程方式替换ASP.NET GridView中的HyperLinkField

Cic*_*ami 6 asp.net gridview hyperlink rowdatabound

我有一个ASP.NET Web窗体应用程序.在我的应用程序中,我有一个可以顺利运行的GridView.我有几个文本字段,最后一个是<asp:hyperlinkfield>.

现在我想通过放置一个简单的链接而不是在hyperlinkfield满足特定条件的情况下以编程方式更改字段.所以我抓住了这个onRowDataBound事件:

Sub myGridView_RowDataBound(ByVal sender As Object, ByVal e As GridViewRowEventArgs) Handles myGridView.RowDataBound

    If (condition) Then
           Dim link = New HyperLink()
           link.Text = "login"
           link.NavigateUrl = "login.aspx"
           e.Row.Cells(3).Controls.Add(link)
        End If
    End If
End Sub
Run Code Online (Sandbox Code Playgroud)

其中nhyperlinkfield是放置的单元格.使用此代码,它只是增加hyperlinkfield了新的代码link.我怎样才能更换它?

PS:代码在VB6中,但我是C#程序员,接受两种语言的答案

lin*_*lnk 7

在这种情况下,我通常将绑定字段转换为模板化字段.

 <asp:TemplateField HeaderText="Title" SortExpression="Title">
    <ItemTemplate>
       <asp:HyperLink ID="TitleHyperLink" runat="server" ></asp:HyperLink>
    </ItemTemplate>
 </asp:TemplateField>
Run Code Online (Sandbox Code Playgroud)

并在代码隐藏中完成剩下的工作.

protected void grid_RowDataBound(object sender, GridViewRowEventArgs e)
{
    if (e.Row.RowType == DataControlRowType.DataRow)
    {
        var link = (HyperLink)e.Row.FindControl("TitleHyperLink");

        if (link != null)
        {
            if (condition)
            {
               link.Text = "login";
               link.NavigateUrl = "login.aspx";
            }
            else 
            {
               link.Text = "default text";
               link.NavigateUrl = "default.aspx";
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 谢谢这个解决方案很好,但令人讨厌的是超链接字段没有 Id 属性 (2认同)

dug*_*gas 6

在添加新控件之前,从集合中删除要替换的控件:

protected void TestGridView_RowDataBound(object sender, GridViewRowEventArgs e)
{
  if (e.Row.RowType == DataControlRowType.DataRow)
  {
    HyperLink newHyperLink = new HyperLink();
    newHyperLink.Text = "New";
    e.Row.Cells[3].Controls.RemoveAt(0);
    e.Row.Cells[3].Controls.Add(newHyperLink);
  }
}
Run Code Online (Sandbox Code Playgroud)

但我同意其他人的意见,只需更改现有链接的属性:

protected void TestGridView_RowDataBound(object sender, GridViewRowEventArgs e)
{
  if (e.Row.RowType == DataControlRowType.DataRow)
  {
    HyperLink link = e.Row.Cells[0].Controls[0] as HyperLink;
    if (link != null)
    {
      link.Text = "New";
      link.NavigateUrl = "New";
    }
  }
}
Run Code Online (Sandbox Code Playgroud)