Usuário com melhor resposta
Ajuda GridView + HyperLinkField Behind.

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();- Movido C. Augusto Proiete [MVP]Moderator domingo, 29 de julho de 2012 11:13 Movido para forum apropriado (De:.NET Development - Geral)
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
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); } }
-
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>
-
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
-