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

时间:2012-02-29 15:29:17

标签: 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

其中 n 是放置hyperlinkfield的单元格。使用此代码,只需添加hyperlinkfieldlink。我该如何更换它?

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

5 个答案:

答案 0 :(得分:7)

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

 <asp:TemplateField HeaderText="Title" SortExpression="Title">
    <ItemTemplate>
       <asp:HyperLink ID="TitleHyperLink" runat="server" ></asp:HyperLink>
    </ItemTemplate>
 </asp:TemplateField>

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

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";
            }
        }
    }
}

答案 1 :(得分: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);
  }
}

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

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";
    }
  }
}

答案 2 :(得分:1)

此时不要创建新链接,而是抓取已经作为字段一部分生成的链接。

If (e.Row.RowType = DataControlRowType.DataRow) Then
    Dim link = e.Row.Cells(3).Controls(0)
    link.Text = "login"
    link.NavigateUrl = "login.aspx"
End If

编辑:已添加If阻止项目行外的操作。

答案 3 :(得分:1)

您可以在aspx文件中执行此操作:

<asp:HyperLink Text='<%# condition ? "TextIfTrue" : "TextIfFalse" %>' NavigateUrl='<%# condition ? "UrlIfTrue" : "UrlIfFalse" %>' />

或投你的

e.Row.Cells(3).Controls(0)

进入超链接并更改其值。

答案 4 :(得分:0)

您可以在aspx中使用:

<asp:HyperLink ID="HyperLink1" CssClass="exercise" runat="server" NavigateUrl="#">Search ¡here!</asp:HyperLink>

在代码隐藏中: 您还可以使用方法:

public string SharePoint(string x)
{

   string page1, page2;

                if (x== "1")
                {
                    string page1="http://nwpage/files.zip";

                    return page1;
                }

                else
                { 


                    string page2="http://example2.aspx";
                    return page2;
                }


        }

如果我在其他方法或页面加载中调用控件,则可以使用路径

添加HyperLink1
 string path= SharePoint(x);
 HyperLink1.NavigateUrl = path;