Как программно заменить HyperLinkField в ASP.NET GridView - PullRequest
6 голосов
/ 29 февраля 2012

У меня есть приложение ASP.NET Web Forms.В моем приложении у меня есть 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.С этим кодом он просто добавляет к hyperlinkfield новый link.Как я могу заменить его?

PS: код написан на VB6, но я программист на C #, принимаются ответы на обоих языках

Ответы [ 5 ]

7 голосов
/ 29 февраля 2012

В подобных ситуациях я обычно преобразую связанное поле в шаблонное поле.

 <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";
            }
        }
    }
}
6 голосов
/ 29 февраля 2012

Удалите элемент управления, который вы хотите заменить из коллекции, перед добавлением нового:

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";
    }
  }
}
1 голос
/ 29 февраля 2012

Вы можете сделать это в вашем файле aspx:

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

или разыграйте

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

в гиперссылку и измените ее значения.

1 голос
/ 29 февраля 2012

Вместо создания новой ссылки на этом этапе, возьмите ссылку, которая уже создана как часть поля.

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, чтобы избежать действия вне элементастроки.

0 голосов
/ 19 марта 2017

Вы можете использовать в 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;
...