none
Ajuda GridView + HyperLinkField Behind. RRS feed

  • Pergunta

  • Olá pessoal, 

    Vocês podem me ajudar com uma dúvida, creio que seja algo simples, mas estou batendo a cabeça.

    Eu tenho um GridView que é populado na behind. Tudo está funcionando, porém eu resolvi desabilitar o AutoGenerateColumns para eu mesmo customizar as colunas. Eu criei um HyperLinkField, só que o problema que eu tenho é que na hora de clicar no link onde seria o código do cliente, ele não consegue achar o Codigo.

    Na renderização fica assim: DetalheCliente.aspx?Cliente=CodigoCliente,

    Onde o certo seria: DetalheCliente.aspx?Cliente=2333

        GridViewClientes.DataSource = chamadoClientes;

                GridViewClientes.AutoGenerateColumns = false;

                HyperLinkField hyperLinkField = new HyperLinkField();
                hyperLinkField.HeaderText = "Cliente";
                hyperLinkField.DataTextField = "CodigoCliente";
                hyperLinkField.NavigateUrl = String.Format("DetalheCliente.aspx?Cliente={0}", hyperLinkField.DataTextField);
                GridViewClientes.Columns.Add(hyperLinkField);
                GridViewClientes.DataBind(); 

    quarta-feira, 25 de julho de 2012 22:38

Respostas

  • Realmente, estava errado.

    Tente o seguinte:

    Utilizando o template field q vc criou e retirando o Eval, coloque isso no OnRowDataBound:

    ChamadoCliente chamadoCliente = (ChamadoCliente)e.Row.DataItem;
                    HyperLink link = e.Row.FindControl("HyperLink1") as HyperLink;
    		link.Text = chamadoCliente.CodigoCliente;
                    link.NavigateUrl = String.Format("DetalheCliente.aspx?Cliente={0}", chamadoCliente.CodigoCliente);

    • Marcado como Resposta Harley Araujo terça-feira, 31 de julho de 2012 19:02
    quinta-feira, 26 de julho de 2012 19:25

Todas as Respostas

  • Você pode utilizar o evento OnRowDataBound, para colocar o id do Cliente no link:

    		protected void grid_RowDataBound(object sender, GridViewRowEventArgs e)
    		{
    			if (e.Row.RowType == DataControlRowType.DataRow)
    			{
    				Cliente cliente = (Cliente)e.Row.DataItem;
    
    				HyperLinkField link = e.Row.FindControl("link") as HyperLinkField;
    
    				link.NavigateUrl = String.Format("DetalheCliente.aspx?Cliente={0}", cliente.Id);
    			}
    		}

    quinta-feira, 26 de julho de 2012 13:03
  • Olá Jeferson, 

    Obrigado, eu tenho da sua forma, mas tenho algumas dúvidas.

    - O HyperLinkField deve ser criado na aspx ou na aspx.cs ? No meu exemplo, eu criei ele na aspx.cs e depois deu um add no gridview.

    Segundo, no seu exemplo, eu recebei um erro:

    Ele da erro na segunda linha: HyperLinkField link = e.Row.FindControl("TitleHyperLink") as HyperLinkField;

    Cannot convert type 'System.Web.UI.Control' to 'System.Web.UI.WebControls.HyperLinkField' via a reference conversion, boxing conversion, unboxing conversion, wrapping conversion, or null type conversion

    if (e.Row.RowType == DataControlRowType.DataRow)

                {
                    ChamadoCliente chamadoCliente = (ChamadoCliente)e.Row.DataItem;
                    HyperLinkField link = e.Row.FindControl("TitleHyperLink") as HyperLinkField;
                    link.NavigateUrl = String.Format("DetalheCliente.aspx?Cliente={0}", chamadoCliente.CodigoCliente);
                }

    Eu consegui fazer utilizando Eval direto na asp.cs, mas eu não gosto, acho que este tipo de informação seria melhor controlada na behind.

    <Columns>
        <asp:TemplateField HeaderText="Cliente" SortExpression="CodigoCliente">
    		<ItemTemplate>
                    	<asp:HyperLink ID="HyperLink1" runat="server" Text='<%# Eval("CodigoCliente") %>' NavigateUrl='<%# String.Format("~/DetalheCliente.aspx?Cliente={0}", Eval("CodigoCliente")) %>'></asp:HyperLink>
                    </ItemTemplate>
            </asp:TemplateField>
    </Columns>


    quinta-feira, 26 de julho de 2012 16:34
  • Realmente, estava errado.

    Tente o seguinte:

    Utilizando o template field q vc criou e retirando o Eval, coloque isso no OnRowDataBound:

    ChamadoCliente chamadoCliente = (ChamadoCliente)e.Row.DataItem;
                    HyperLink link = e.Row.FindControl("HyperLink1") as HyperLink;
    		link.Text = chamadoCliente.CodigoCliente;
                    link.NavigateUrl = String.Format("DetalheCliente.aspx?Cliente={0}", chamadoCliente.CodigoCliente);

    • Marcado como Resposta Harley Araujo terça-feira, 31 de julho de 2012 19:02
    quinta-feira, 26 de julho de 2012 19:25
  • Muito obrigado Jefferson
    quarta-feira, 1 de agosto de 2012 14:39