ASP.NET GridView - Parte 10

watch_later 22 de abr de 2013

Como passar valores externos com um GridView HyperLinkField que não fazem parte do seu DataSource?
DataNavigationUrlField usa apenas esses campos como parâmetros que fazem parte do DataSource. Agora, o problema surge quando você quer passar algumas outras variáveis ​​como parâmetros que não são parte do DataSource. Como mostrado na imagem abaixo, estamos passando EmpID e parentid como argumentos e esses dois campos são os membros de dados do GridView DataSource.












Agora, digamos que você deseja passar um ChildID para esse registro especial junto com ParentID e EmpID e você quer que a URL hyperlink seja como "default.aspx? EmpID = 1 & ParentID = P1 & ChildID = C1" onde ChildID não faz parte do DataSource.
Você pode conseguir isso no code-behind do seu GridView. Há dois eventos onde você pode substituir o URL de navegação do campo hyperlink. Você pode usar Gridview_RowDataBound ou Gridview_PreRender.
Vamos começar com Gridview_RowDataBound. O evento RowDataBound do GridView é disparado quando uma linha de dados é vinculada aos dados. Assim, para cada linha, o evento RowDataBound é chamado para ligar com dados reais da fonte de dados. No evento RowDataBound, você pode verificar para o controle de células em particular e pode acrescentar o NavigateURL. Abaixo, está o trecho de código:
protected void grdStudent_RowDataBound(object sender, GridViewRowEventArgs e)
{
    if (e.Row.RowType == DataControlRowType.DataRow)
    {
        HyperLink hyperlink = (HyperLink)e.Row.Cells[0].Controls[0];
        hyperlink.NavigateUrl += "&ChildID=" + this.ExternalValue;
    }
}

Você pode fazer a mesma coisa no caso Gridview_PreRender de uma maneira similar. De acordo com o ciclo de vida da página ASP.NET, Pre_Render para um controle é gerado apenas antes de salvar o estado de exibição e o evento Render. Este é o último evento onde você pode personalizar o seu controle antes de salvar os dados viewstate. Abaixo, está o trecho de código:
protected void grdStudent_PreRender(object sender, EventArgs e)
{
    foreach (GridViewRow row in grdStudent.Rows)
    {
        if (row.RowType == DataControlRowType.DataRow)
        {
             HyperLink grdviewLink = (HyperLink)row.Cells[0].Controls[0];
             grdviewLink.NavigateUrl += "&ChildID=" + this.externalValue;
        }
    }
}

Se você quer saber como ele está realmente trabalhando, basta definir um ponto de interrupção durante o evento bound dos dados, e você vai encontrar o NavigateURL para esse campo hyperlink já foi definido com o valor que você passou como DataNavigationUrlField. E dentro RowDataBound ou Pre_Render, estamos anexando o mesmo NavigateURL com um parâmetro externo.






















Abaixo está o trecho de HTML para o HyperLinkField.





Você pode usar as propriedades NavigateURL para HyperLinkField para definir a URL, mas NavigateURL irá definir a mesma URL para todas as linhas. Então, se você quer uma URL diferente para cada linha, você tem que usar DataNavigationUrlField ou você precisará substituir NavigateURL durante RowDataBound ou Pre_Render.

Outras Postagens do GridView

ASP.NET GridView - Parte 1
ASP.NET GridView - Parte 2
ASP.NET GridView - Parte 3
ASP.NET GridView - Parte 4
ASP.NET GridView - Parte 5
ASP.NET GridView - Parte 6