Usuário com melhor resposta
[SEM RESOLUÇÃO] Passando parâmetros para outra página a partir de um GridView

Pergunta
-
Olá amigos,
Estou com um pequeno problema difícil de resolver.
Tenho um GridView que utilizo uma forma de busca dinâmica quando carregada. Busca por jQuery.
Ex: Tem 15mil registros de usuários no GridView, e você quer pesquisar os registros pelo nome para facilitar a busca, então a cada letra digitada no TextBox, o Grid vai alterando até sobrar somente o registro que você quer.
Até ai tranquilo, funciona perfeitamente.
Agora eu quero modificar esse dado utilizando uma outra página, e essa página eu acesso clicando no href com o link da página.
<ul> <li><a href="UpdateUser.aspx">Modificar cartão</a></li> </ul>
O que eu preciso é passar como parâmetro para essa página o código do funcionário, porém não consigo selecionar a linha ou o registro que vou passar por parâmetro.
Será que alguém consegue me dar uma luz?
Cleverson Darsie
- Editado Cleverson Darsie quinta-feira, 6 de novembro de 2014 14:08 Ninguém capacitado para resolver
Respostas
-
Maurício,
Não funciona dessa forma, pois estou utilizando um jQuery para fazer busca no GridView.
Teria que fazer algo como o Edno falou, utilizar o próprio jQuery para pegar o valor da célula que eu quero, gravar em um Session e pegar na página de Update esse valor.
Eu andei procurando funções para isso, mas não que pegam o valor, apenas realça a célula que eu cliquei.
$(document).ready(function () { $("#<%=GridViewUsers.ClientID%> tr").filter(":not(:has(table, th))").click(function (e) { var $cell = $(e.target).closest("td"); $("#<%=GridViewUsers.ClientID%> td").removeClass("highlight"); $cell.addClass("highlight"); }); }); <style type="text/css" media="screen"> .highlight { background-color:#9999FF; } td { cursor:pointer; } </style>
Não conheço nada de jQuery para tentar fazer algo rsrs.
Cleverson Darsie
- Marcado como Resposta Cleverson Darsie quinta-feira, 6 de novembro de 2014 14:09
Todas as Respostas
-
-
Você pode fazer via code_behind no evento OnRowCommand como citado ou passando por QueryString algo como :
<ul> <li><a href="WebForm3.aspx?NumeroCartao=0000>Modificar cartão</a></li> </ul>
Mas o problema desse modo seria que o codigo fica visivel ao usuario !
Pode usar também Session ! Creio que seria o melhor caminho, você le o codigo joga em uma Session e captura na sua outra pagina !
-
O ideal é verificar como você está colocando o link no gridview e depois sim podemos dar uma solução melhor. A idéia do OnRowCommand é boa...mas eu mudaria o href na hora de popular o grid para "UpdateUser.aspx?id=xxx" pois eu acho que ficaria mais rápido.
Dá uma olhada nesse link:
http://asp-net-example.blogspot.com.br/2008/11/aspnet-asphyperlinkfield-example-how-to_13.html
e veja se ajuda.
Abraços !
-
Amigos,
O problema na verdade não é passar o parâmetro, devo ter me expressado mal na dúvida.
O que não estou conseguindo fazer é pegar o valor do código do usuário no GridView.
Eu tentei por RowCommand, porém o GridView não deixa visível o LinkButton "Selecionar" que eu criei, por exemplo.
Quando eu carrego o Grid no PageLoad ele aparece, mas na mesma hora o botão some. Deve ser por conta do jQuery que existe no Grid para a busca dinâmica.Cleverson Darsie
-
Alguma função nesse seu código com jQuery está deixando visible=false para todos os itens dentro da linha do gridview...e na hora de voltar, não está voltando os controles dentro da linha...
O que você pode fazer é:
1. analisar o código que faz a pesquisa dinâmica pra deixar o botão visible juntamente com a linha; ou
2. setar manualmente o visible=true, mas aí é meio porco o esquema...
Caso não seja isso, por favor, posta novamente que a gente vai eliminando soluções hehe :D
abraços !
-
Bom Diego, não sei se é isso. Lugar nenhum da jQuery tem a opção para visible=false.
Segue abaixo o código da GridView e da jQuery para compreensão.
<script type="text/javascript" src="Scripts/jquery-1.8.3.min.js"></script> <script type="text/javascript" src="Scripts/ASPSnippets_Pager.min.js"></script> <script type="text/javascript"> $(function () { GetCartoes(1); }); $("[id*=txtSearch]").live("keyup", function () { GetCartoes(parseInt(1)); }); $(".Pager .page").live("click", function () { GetCartoes(parseInt($(this).attr('page'))); }); function SearchTerm() { return jQuery.trim($("[id*=txtSearch]").val()); }; function GetCartoes(pageIndex) { $.ajax({ type: "POST", url: "DBLabUsers.aspx/GetCartoes", data: '{searchTerm: "' + SearchTerm() + '", pageIndex: ' + pageIndex + '}', contentType: "application/json; charset=utf-8", dataType: "json", success: OnSuccess, failure: function (response) { alert(response.d); }, error: function (response) { alert(response.d); } }); } var row; function OnSuccess(response) { var xmlDoc = $.parseXML(response.d); var xml = $(xmlDoc); var cartoes = xml.find("cartoesdelogon"); if (row == null) { row = $("[id*=GridViewUsers] tr:last-child").clone(true); } $("[id*=GridViewUsers] tr").not($("[id*=GridViewUsers] tr:first-child")).remove(); if (cartoes.length > 0) { $.each(cartoes, function () { var cartao = $(this); $("td", row).eq(0).html($(this).find("Select").text()); //aqui são os campos da jQuery $("td", row).eq(1).html($(this).find("c1syslab4").text()); $("td", row).eq(2).html($(this).find("c2syslab4").text()); $("td", row).eq(3).html($(this).find("c9syslab4").text()); $("td", row).eq(4).html($(this).find("c10syslab4").text()); $("td", row).eq(5).html($(this).find("c4syslab4").text()); $("td", row).eq(6).html($(this).find("c11syslab4").text()); $("td", row).eq(7).html($(this).find("c12syslab4").text()); $("td", row).eq(8).html($(this).find("c16syslab4").text()); $("td", row).eq(9).html($(this).find("c14syslab4").text()); $("td", row).eq(10).html($(this).find("c17syslab4").text()); $("td", row).eq(11).html($(this).find("c18syslab4").text()); $("td", row).eq(12).html($(this).find("c19syslab4").text()); $("td", row).eq(13).html($(this).find("c20syslab4").text()); $("[id*=GridViewUsers]").append(row); row = $("[id*=GridViewUsers] tr:last-child").clone(true); }); var pager = xml.find("Pager"); $(".Pager").ASPSnippets_Pager({ ActiveCssClass: "current", PagerCssClass: "pager", PageIndex: parseInt(pager.find("PageIndex").text()), PageSize: parseInt(pager.find("PageSize").text()), RecordCount: parseInt(pager.find("RecordCount").text()) }); $(".c2syslab4").each(function() { var searchPattern = new RegExp('(' + SearchTerm() + ')', 'ig'); $(this).html($(this).text().replace(searchPattern, "<span class = 'highlight'>" + SearchTerm() + "</span>")); }); } else { var empty_row = row.clone(true); $("td:first-child", empty_row).attr("colspan", $("td", row).length); $("td:first-child", empty_row).attr("align", "center"); $("td:first-child", empty_row).html("Nenhum registro encontrado para essa pesquisa."); $("td", empty_row).not($("td:first-child", empty_row)).remove(); $("[id*=GridViewUsers]").append(empty_row); } }; </script> </head> <body> <form id="form1" runat="server"> <header id="header"> <a href="/"><img src="Imagens/Logotipo.png" alt="home"/></a> <h1>DBLab User List</h1> </header> <div class="sidebar" id="sidebar"> <h2>Tarefas</h2> <ul> <li><a href="NewUser.aspx">Novo cartão </a></li> </ul> <ul> <li><a href="UpdateUser.aspx">Modificar cartão</a></li> </ul> </div> <div id="content"> <div> Search: <asp:TextBox ID="txtSearch" runat="server" /> <hr /> </div> <asp:GridView ID="GridViewUsers" runat="server" AutoGenerateColumns="False" OnRowCommand="GridViewUsers_RowCommand" > <Columns> <asp:ButtonField CommandName="Select" Text="Select" ButtonType="Link" /> //Aqui é o Select da linha que não aparece <asp:BoundField DataField="c1syslab4" HeaderText="Cartão" SortExpression="c1syslab4" /> <asp:BoundField DataField="c2syslab4" HeaderText="Nome" SortExpression="c2syslab4" /> <asp:BoundField DataField="c9syslab4" HeaderText="E-Mail" SortExpression="c9syslab4" /> <asp:BoundField DataField="c10syslab4" HeaderText="Local" SortExpression="c10syslab4" /> <asp:BoundField DataField="c4syslab4" HeaderText="Ativo" SortExpression="c4syslab4" /> <asp:BoundField DataField="c11syslab4" HeaderText="Bloqueado" SortExpression="c11syslab4" /> <asp:BoundField DataField="c12syslab4" HeaderText="Permissões" SortExpression="c12syslab4" /> <asp:BoundField DataField="c16syslab4" HeaderText="Dias default" SortExpression="c16syslab4" /> <asp:BoundField DataField="c14syslab4" HeaderText="Expiração" SortExpression="c14syslab4" /> <asp:BoundField DataField="c17syslab4" HeaderText="Aplicativo" SortExpression="c17syslab4" /> <asp:BoundField DataField="c18syslab4" HeaderText="Vínculos" SortExpression="c18syslab4" /> <asp:BoundField DataField="c19syslab4" HeaderText="Data Registro" SortExpression="c19syslab4" /> <asp:BoundField DataField="c20syslab4" HeaderText="Conta Registro" SortExpression="c20syslab4" /> </Columns> </asp:GridView> <div class="Pager"></div> </div><!-- content -->
Estou desde sexta-feira tentando desvendar esse problema. Não está facil! Se não fosse isso já teria passado o valor por parâmetro.Cleverson Darsie
-
-
Sim Edno!
A linha está removendo o botão. Mas tem um problemão aí. Essa linha também remove os usuários que não estão na minha busca quando eu começo a digitar no TextBox.Fiz o teste apenas comentando a linha e selecionando o cartão que eu gostaria, fiz o debug, e funcionou perfeitamente, passou como parâmetro e consegui fazer a edição do usuário na outra página.
Porém eu tentei localizar um usuário por nome, e nada aconteceu, continuou mostrando todos os usuários.
O que fazer? tentar uma outra forma de busca dinâmica sem utilização de jQuery ou será que há uma forma de utilizar o jQuery sem que remova o botão?
Cleverson Darsie
-
-
Boa Edno,
Dessa forma funcionou!
Apenas um detalhe. Agora quando eu clico em selecionar, a tela da uma piscada, como se eu tivesse apertado F5. E o valor da célula selecionada é sempre o da primeira linha, e nunca da linha que eu cliquei pra selecionar.Tem alguma coisa a ver?
Fiz o debug e o CommangArgument sempre retorna 0 (zero).
Por isso pega sempre o index zero, invés do index que eu selecionei.
protected void GridViewUsers_RowCommand(object sender, GridViewCommandEventArgs e) { if (e.CommandName == "Select") { int index = Convert.ToInt32(e.CommandArgument); GridViewRow row = GridViewUsers.Rows[index]; sg.updCard = GridViewUsers.Rows[index].Cells[1].Text;
Estranho que funcionou da outra vez. Ou eu estou enganado =S
//Server.HtmlDecode(row.Cells[1].Text); } }
Cleverson Darsie
-
-
Pois é!
Não há nenhum atributo CommandArgument definido, pois o para ButtonField não é válido.
Vou ter que alterar para outro tipo de Button ou utilizar TemplateField. Ou será que dessa forma ainda é possível pegar o valor da linha que eu quero?
Vou fazer um novo teste mais tarde e retorno com o que ocorreu.
Obrigado por enquanto Edno.Cleverson Darsie
-
Bom dia amigos,
Eu defini o atributo para o CommandArgument, conforme abaixo:
<asp:TemplateField> <ItemTemplate> <asp:LinkButton ID="Select" runat="server" CommandName="Select" CommandArgument="<%#((GridViewRow)Container).RowIndex %>" Text="Select" /> </ItemTemplate> </asp:TemplateField>
protected void GridViewUsers_RowCommand(object sender, GridViewCommandEventArgs e) { if (e.CommandName == "Select") { int index = Convert.ToInt32(e.CommandArgument); GridViewRow row = GridViewUsers.Rows[index]; sg.updCard = GridViewUsers.Rows[index].Cells[1].Text; } }
Porém quando faço o debug do código, o CommandArgument continua vindo com o valor 0 (zero) no index.
Será que isso tem alguma coisa a ver com a busca dinâmica do jQuery? Não importa em qual linha eu clique, sempre fica zero o e.CommandArgument.
Tenho outras páginas na aplicação que também pegam o valor de uma célula para passar como parâmetro, mas essa está dando problema.
Cleverson Darsie
-
-
Tentou a propriedade DataTextField para o ButtonField ?
-
Diego, fazendo com o DataTextField fica da mesma forma.
Eu removi o código do jQuery pra ver se era esse mesmo o problema, e sim, é esse. Sem o jQuery de busca dinâmica ele seleciona o index que eu escolhi realmente.
Edno,
Dessa forma eu nunca utilizei, e sendo sincero, nem sei como fazer! rsrs
Será que pode me ajudar para ver se funciona dessa forma?
Cleverson Darsie
-
Cleverson,
no jQuery você substituiria
$("td", row).eq(0).html($(this).find("Select").text());
por:
$("td", row).eq(0).html("<a href='Update.aspx?Id="+$(this).find("Id").text()+"'>Select</a>")
sendo que "Update.aspx" é a página que faz a edição, e o "Id" é o campo do xml que deve trazer o Id do cartão.
Já na página de update, você pega o valor passado através da URL no método page_load com o método
"Request.QueryString["Id"]"
-
Entendi Edno,
Porém dessa forma descaraterizaria a forma que pretendo utilizar a aplicação. Invés do botão "Select", eu deveria nomear como "Editar", por exemplo. É algo que não gostaria de fazer.
Outra coisa, deu um erro quando estava testando essa forma que você me passou:
Na parte de pegar o valor na outra página eu usei assim:
protected void Page_Load(object sender, EventArgs e) { sg.updCard_2 = Request.QueryString["Id"]; //Continuação do código }
Fiz algo errado?
Cleverson Darsie
-
-
Falha minha.
Alterei e deu certo.
Mas como eu disse, isso descaracteriza a forma que eu pretendia utilizar na aplicação.Por hora vou utilizar dessa forma, mas ainda vou tentar procurar alguma maneira em que eu possa fazer como pretendia.
Não sei se mudando a forma de pesquisa dinâmica na tabela, ou se houver uma solução para a forma em que está hoje.
Mas obrigado mesmo assim, foi de grande ajuda! =D
Cleverson Darsie
-
-
Veja o link abaixo:
http://ecode10.com/article/pesquisar.aspx?q=rowcommand
Espero ter ajudado. Se ajudei, favor marcar no fórum falando que foi útil.
Mauricio Junior - Comunidade www.ecode10.com -
Maurício,
Não funciona dessa forma, pois estou utilizando um jQuery para fazer busca no GridView.
Teria que fazer algo como o Edno falou, utilizar o próprio jQuery para pegar o valor da célula que eu quero, gravar em um Session e pegar na página de Update esse valor.
Eu andei procurando funções para isso, mas não que pegam o valor, apenas realça a célula que eu cliquei.
$(document).ready(function () { $("#<%=GridViewUsers.ClientID%> tr").filter(":not(:has(table, th))").click(function (e) { var $cell = $(e.target).closest("td"); $("#<%=GridViewUsers.ClientID%> td").removeClass("highlight"); $cell.addClass("highlight"); }); }); <style type="text/css" media="screen"> .highlight { background-color:#9999FF; } td { cursor:pointer; } </style>
Não conheço nada de jQuery para tentar fazer algo rsrs.
Cleverson Darsie
- Marcado como Resposta Cleverson Darsie quinta-feira, 6 de novembro de 2014 14:09