none
desabilitar objetos ao carregar gridview RRS feed

  • Pergunta

  • tenho a função CarregaGrid. Ela preenche uma gridview. Chamo a mesma quando clico no botão ok.

    só q quando clico no botão ok preciso desabilitar os controles da página. e aí faço isso antes de chamar a função CarregaGrid.

    só que o estranho é que os controles estão desabiliando somente depois que gridview é preenchido. só que se eu tiro a função CarregaGrid os controles ficam desabilitados.

    alguém sabe porque isso ocorre?

    segunda-feira, 21 de maio de 2012 14:31

Todas as Respostas

  • Quais controles ficam desabilitados ?

    Junior

    segunda-feira, 21 de maio de 2012 14:46
  • dropdowlists e textboxs. só que eles devem ficar desabilitados assim q o botao for clicado. e só ficam desabilitados depois que o gridview é carregado.

    tem q desabilitar quando clicar no botão e só pode habilitar novamente depois que o gridview já foi carregado.

    sabe pq isso acontece?

    segunda-feira, 21 de maio de 2012 14:50
  • dropdowlists e textboxs. só que eles devem ficar desabilitados assim q o botao for clicado. e só ficam desabilitados depois que o gridview é carregado.

    tem q desabilitar quando clicar no botão e só pode habilitar novamente depois que o gridview já foi carregado.

    sabe pq isso acontece?


    um detalahe: todos os meus controles, inclusive o gridview, estão dentro de um panel.
    segunda-feira, 21 de maio de 2012 14:58
  • se esses controles estão no gridview, claro que eles serão carregados no load do gridview, como vc quer que os controles seja habilitados ou nao se o gridview ainda não carregou ?

    Se esses controles não estão no gridview a página vai ser renderizada no bind do gridview ai ele habilita ou desabilita os controles entendeu ?


    Junior

    segunda-feira, 21 de maio de 2012 15:01
  • Você pode chamar a função desabilitar e depois a de carregar o gridView.

    Desabilitar();
    
    Pesquisar();


    Se fizer o desabilitar dentro do método de busca vai ter que esperar o bind do Grid, como o colega citou:

    Pesquisar()
    {
        Desabilitar();
       // etc
    }

    Mas veja bem, mesmo que não exiba resultado você ainda vai deixar os controles desabilitados??

    Se deixar, permita que o usuário "Limpe" os dados da pesquisa, neste caso habilitando novamente os controles.


    Paulo César Viana
    MCC,MCP,MCTS
    --

    Marque as respostas e contribua para uma melhora no fórum.

    segunda-feira, 21 de maio de 2012 15:07
  • Acontece pq quando vc utiliza o atributo enabled true / false ele somente é aplicado quando a página sofre o submit, ou seja, o click do botão 'OK'. Então a página é carregada novamente e já aplicando o atributo de enabled que vc setou. Não importa o que virá primeiro, a função que carrega o grid ou a que desabilita os controles.

    Se você precisa desabilitar os controles para que o usuário não fique submitando (existe isso? oO') o form várias vezes enquanto a página estiver sendo carregada, é preciso utilizar JavaScript. Desta forma, os controles serão desabilitados antes mesmo do form ser enviado.

    Veja um exemplo, em um button:

    <asp:Button ID="btEnviar" runat="server" Text="Enviar" UseSubmitBehavior=true onclick="btEnviar_Click" OnClientClick="saveForm(this)" />

    Perceba que estou usando 2 eventos: onclick e OnClientClick. O OnClick é o evento executado no servidor. O OnClientClick é o evento executado no lado cliente, ou seja, antes de ser enviado para o servidor.

    A função saveForm(this) é um bloco de código em JavaScript que desabilita o próprio botão de envio (por isso o parâmetro 'this'). Se você quiser desabilitar outros, também é possível, bastando adicioná-los no corpo da função.

    Você vai encontrar dois problemas com isso. O primeiro, é que o ID dos elementos são modificados quando a página é renderizada. Então se você colocar um JavaScript de disabled no elemento com o mesmo ID do ASP.NET, ele não vai reconhece-lo. O .NET 4 te dá a possibilidade de inserir um ID exclusivo, e ele não será alterado. Basta configurar o atributo 'ClientIdMode'. Outra forma de fazer isto é executar a página, visualizar o código fonte da página executada no browser e copiar o ID modificado. Este deverá ir para a função JavaScript.

    O outro problema que você poderá encontrar, é caso sua página tenha validação de qualquer controle que não seja Custom Validator. O problema ocorre porque o controle de validação bloqueará o envio da página e simultaneamente os elementos serão desabilitados. Existe uma solução para isto e é um código relativamente simples.

    Segue a função javascript completa, já com esta solução:

    <script type="text/javascript">
            function saveForm(c) {
                
                //Chama o método do Envio quando toda página estiver válida (referente aos Controles de Validação)
                if (Page_ClientValidate()) {
                    c.disabled = true; //Desabilita o botão de envio         
                    __doPostBack(c.name, ""); //Realiza um postback passando como parâmetro o nome do controle. Com isso, o método de Click é chamado e o método relacionado do Code Behind é chamado também.
                }
            }
    </script>


    Rafael Santos
    E-mail: rsdsantos@gmail.com

    Pequeno Gafanhoto

    segunda-feira, 21 de maio de 2012 15:32
  • Rafael você pode fazer isso via JQuery para bloquear os controles, não havendo necessidade de inativar os mesmo via servidor:

    .cs
    using System;
    using System.Data;
    using System.Linq;
    using System.Collections.Generic;
    using System.Web.UI.WebControls;
    
    namespace WebApplication1
    {
        public partial class WebForm1 : System.Web.UI.Page
        {
            protected void Page_Load(object sender, EventArgs e)
            {
    
            }
    
            protected void btnTeste_Click(object sender, EventArgs e)
            {
                //Simulando rotina demorada do servidor
                System.Threading.Thread.Sleep(5000);
            }
        }
    }
    

    .aspx
    <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="WebForm1.aspx.cs" Inherits="WebApplication1.WebForm1" %>
    
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head>
        <title></title>
        <script src="http://ajax.aspnetcdn.com/ajax/jQuery/jquery-1.7.2.min.js" type="text/javascript"></script>
        <script type="text/javascript">
    
            function Desabilitar() {
                setTimeout(function () {
                    $('#desabilitar *').attr('disabled', 'disabled');
                    $('[id$=btnTeste]').attr('value', 'Aguarde...');
                }, 500);
            };
            
        </script>
    </head>
    <body>
        <form id="form1" runat="server">
        <%--Os controles da div abaixo não sera desabilitado--%>
        <div id="naoDesabilitar">
            <asp:TextBox runat="server" />
            <br />
            <asp:DropDownList runat="server">
                <asp:ListItem Text="text1" />
                <asp:ListItem Text="text2" />
            </asp:DropDownList>
            <br />
            <asp:CheckBox Text="text" runat="server" />
            <br />
            <br />
        </div>
        <%--Os controles da div abaixo sera desabilitado--%>
        <div id="desabilitar">
            Desabilitar controles abaixo com click:
            <br />
            <asp:Button Text="Fazer teste" runat="server" ID="btnTeste" OnClick="btnTeste_Click"
                OnClientClick="Desabilitar();" />
            <br />
            <asp:CheckBox Text="text" runat="server" />
            <br />
            <asp:CheckBoxList runat="server">
                <asp:ListItem Text="text1" />
                <asp:ListItem Text="text2" />
            </asp:CheckBoxList>
            <br />
            <asp:RadioButtonList runat="server">
                <asp:ListItem Text="text1" />
                <asp:ListItem Text="text2" />
            </asp:RadioButtonList>
        </div>
        </form>
    </body>
    </html>
    

    Vitor Mendes | Seu feedback é muito importante para todos!
    Visite o meu site: http://www.vitormendes.com.br/

    segunda-feira, 21 de maio de 2012 16:21
  • rafael, a função javascript não está funcionando. dá erro de objeto esperado. mais pelo que vi a função está. debuguei passo a passo dela com alert. o que pode ser?

    <asp:Button ID="btnLocalizar" runat="server" Text="Localizar" Width="150px" Height="40px" OnClientClick="saveForm(this)" UseSubmitBehavior=true />

    function saveForm(c) {

        //Chama o método do Envio quando toda página estiver válida (referente aos Controles de Validação)
        if (Page_ClientValidate()) {
            alert('caiu');
            c.disabled = true; //Desabilita o botão de envio        
            __doPostBack(c.name, ""); //Realiza um postback passando como parâmetro o nome do controle. Com isso, o método de Click é chamado e o método relacionado do Code Behind é chamado também.
           
        }
    }

    e se eu colocar o meu evento onclick que já está no código, a página não é nem carregada.

    segunda-feira, 21 de maio de 2012 16:36
  • rafa-martin, você está usando algum controle de validação? Se não tiver, não precisa utilizar a função desta forma.

    Rafael Santos
    E-mail: rsdsantos@gmail.com

    Pequeno Gafanhoto

    segunda-feira, 21 de maio de 2012 19:29