none
[SEM RESOLUÇÃO] Passando parâmetros para outra página a partir de um GridView RRS feed

  • 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
    segunda-feira, 5 de maio de 2014 14:20

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
    terça-feira, 6 de maio de 2014 15:23

Todas as Respostas

  • Você não consegue acessar a linha dentro do evento "OnRowCommand" da GridView?
    segunda-feira, 5 de maio de 2014 14:35
  • 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 !

    segunda-feira, 5 de maio de 2014 14:43
  • 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 !

    segunda-feira, 5 de maio de 2014 14:45
  • 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

    segunda-feira, 5 de maio de 2014 15:06
  • 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 !

    segunda-feira, 5 de maio de 2014 16:28
  • 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

    segunda-feira, 5 de maio de 2014 17:17
  • $("[id*=GridViewUsers] tr").not($("[id*=GridViewUsers] tr:first-child")).remove();
    não é essa linha que ta removendo o botão?
    segunda-feira, 5 de maio de 2014 17:26
  • 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

    segunda-feira, 5 de maio de 2014 17:53
  • E se você substituir

    $("td", row).eq(0).html($(this).find("Select").text());

    por

    $("td", row).eq(0).html("<a href='javascript:__doPostBack(&#39;GridViewUsers&#39;,&#39;Select$0&#39;)' >Select</a>");

    o que acontece?

    segunda-feira, 5 de maio de 2014 18:48
  • 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;
    //Server.HtmlDecode(row.Cells[1].Text); } }
    Estranho que funcionou da outra vez. Ou eu estou enganado =S


    Cleverson Darsie

    segunda-feira, 5 de maio de 2014 19:29
  • Como está o código da sua gridview agora?

    No código que você postou acima não está definindo o atributo CommandArgument no botão de selecionar.

    segunda-feira, 5 de maio de 2014 19:47
  • 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

    segunda-feira, 5 de maio de 2014 20:00
  • 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

    terça-feira, 6 de maio de 2014 12:51
  • Você pode passar o Id através da Query String se isso não for um problema. Você montaria a URL no jQuery com o código que deve vir do XML
    terça-feira, 6 de maio de 2014 13:11
  • Tentou a propriedade DataTextField para o ButtonField ?
    terça-feira, 6 de maio de 2014 13:12
  • 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

    terça-feira, 6 de maio de 2014 13:49
  • 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"]"

    terça-feira, 6 de maio de 2014 13:59
  • 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

    terça-feira, 6 de maio de 2014 14:17
  • O erro que ta dando é que não encontrou a página localhost:60546/Update.aspx

    você ta fazendo a edição na mesma página ou em uma página diferente?

    terça-feira, 6 de maio de 2014 14:26
  • 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

    terça-feira, 6 de maio de 2014 14:34
  • Outra opção é utilizar o próprio jQuery pra tratar o click do botão e receber o ID na mesma página através de um WebMethod.
    terça-feira, 6 de maio de 2014 14:46
  • 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

    terça-feira, 6 de maio de 2014 14:56
  • 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
    terça-feira, 6 de maio de 2014 15:23