Contagem Regressiva com C# e JavaScript


por Mauricio Junior em 1/1/2011 0

        Olá pessoal, gostariade mostrar hoje como desenvolver de forma dinâmica um contador regressivo feitoem javascript comunicando com o C#, mais especificamente com o Control Toolkit.

 

Requisitos:

Visual Studio.NET 2008

Linguagem C#.NET

AjaxControlToolkit

 

Foi me dado a missão de gerar um relatório quea cada 30 segundos atualizasse automaticamente depois de clicar no botão paragerar. Até ai é tranqüilo, pois é necessário usar o Timer e o GridView.

Só que era necessário mostrar os segundos natela ao usuário. Isto é, os segundos decrescentes 30, 29, 28, 27...e assim pordiante, o contador deve ser mostrado na tela acima de todos os objetos. 

Para facilitar o artigo, vou mostrar algumastelas com o resultado do que foi desenvolvido. Para ficar mais fácil deentender, segue a tela 1. (imagem 1)

Imagem 1

 

Na figura (imagem 1), uma tela de gráfico émostrada com os segundos no canto direito sendo diminuído. O mesmo começou com30.

Esses segundos devem ficar em cima e toda atela, nunca podendo ficar a trás de algum componente de tela. Na próximaimagem, a tela subiu e os segundos continuam regredindo e acima do gráfico.(Imagem 2)

 

Imagem 2

 

Agora em diante vou mostrar como fazer estessegundos ficar acima da imagem e ter o sincronismo para atualizar a página peloC# depois de acabar a contagem.

 

Primeiro passo

O primeiro passo é criar o contador regressivoem JavaScript. (Code 1)

 

<script language=”javascript”>

 

        var parselimit;

        function inicio() {

            clock1.innerHTML = "";

            var limit = "0:31"

 

            if (document.images) {

                parselimit = limit.split(":")

                parselimit = parselimit[0] * 60 + parselimit[1] * 1

            }

 

            begintimer();

        }

 

        function finalizar() {

            parselimit = 1;

        }

 

        function begintimer() {

           

            if (!document.images)

                return

 

            if (parselimit == 1) {

                //document.forms[0].submit();

                //window.location = "site de destino apos o tempo"

            } else {

                parselimit -= 1

                curmin = Math.floor(parselimit / 60)

                cursec = parselimit % 60

                if (curmin != 0) {

                    curtime = curmin + " minutos e " + cursec + " segundos para você sair dessa página"

                }

                else {

                    curtime = cursec + " Segundos regredindo....."

                    //window.status = curtime

                    clock1.innerHTML = cursec

                    setTimeout("begintimer()", 1000)

                }

            }

        }

</script>

 

<html>

<span id="clock1"></span>

</html>

Code 1

 

Como é feito nocódigo em javascript para escrever na tela? A pergunta é fácil e tranqüila, nafunção inicio(), o objeto de telachamado clock1 é zerado com o innerHTML. No código beginTimer() esse mesmo objeto é escritona tela de tempos em tempos. Nas últimas linhas você pode ver o código, antesdo setTimeout(...).

O segundo passo é colocar a tela para atualizarde 30 em 30 segundos usando o Timer.

 

 

<%@ Register Assembly="AjaxControlToolkit" Namespace="AjaxControlToolkit" TagPrefix="cc1" %>

 

Code 2

Não preciso explicar muito como usar o Timer,só vou dar os passos para usar. Primeiro coloquei o registro na página doAjaxControlToolkit. Você pode pegar a DLL no site www.asp.net.

 

 

 

 

<asp:Timer ID="Timer1" runat="server" Enabled="false" Interval="30000"

ontick="Timer1_Tick">

</asp:Timer>

Code 3

Depois de colocar o registro, carreguei ocomponente chamado Timer onde coloquei desabilitado e no intervalo de 30.000milisegundos que equivale 30 segundos. Cliquei duas vezes no componente e gerouo onclick. (Code 4)

 

 

        protected void Timer1_Tick(object sender, EventArgs e)

        {

            try

            {

                GerarRelatorio();

            }

            catch (Exception ex)

            {

                throw ex;

            }

        }

Code 4

 

Depois disso, o timer está funcionandoperfeitamente e de 30 em 30 segundos o sistema gera o relatório passando pelométodo Timer1_Tick. É lógico que usar o UPDATEPANEL (não citadoanterioremente).

 

Sempre visível

Para manter sempre visível o tempo rodando, preciseiusar o componente do Control Toolkit chamado AlwaysVisibleControlExtender.(Code 5)

 

 

<cc1:AlwaysVisibleControlExtender ID="AlwaysVisibleControlExtender1"

                runat="server" TargetControlID="pnlClock"

                VerticalOffset="1"

                VerticalSide="Bottom"

                HorizontalSide="Right"

                HorizontalOffset="70"

                ScrollEffectDuration=".1">

            </cc1:AlwaysVisibleControlExtender>

           

            <asp:Panel ID="pnlClock" runat="server" Visible="false">

                <table width="100px" border="1" cellpadding="0" cellspacing="0" style="background-color:White; border-color:Black;">

                    <tr>

                        <td>

                            <br />

                            <span id="clock1"></span>

                            <br /><br />

                        </td>

                    </tr>

                </table>

            </asp:Panel>

Code 5

Existem duas coisas importantes para se destacarno Code 5. A primeira é o uso e a configuração do componente AlwaysVisible... Asegunda é a colocação de um Panel contendo o <spanid=”clock1”></span>. Ou seja, não é toda hora que ele vai servisualizado de acordo com a regra de negócio. O Panel é para ser usado nocomponente AlwaysVisibleControlExtender e assim mantém sempre visível na tela enão importe o objeto que seja nela.

 

O que falta?

Para terminar o que foi feito falta sincronizaro JavaScript com o C#.NET. Pois até agora o tempo está rodando na tela e otimer está rodando e contando no C#. Quando termina o tempo do Timer, énecessário atualizar na tela o contador JavaScript. Para isso no início doartigo, coloquei os códigos inicio()e finalizar() timer.

Quando o contador terminar a contagem e foratualizar o relatório, preciso que seja atualizado o tempo que está rodando viaJavaScript, dessa forma fiz um método que o C#.NET chama o código JavaScript.(Code 6).

 

 

protected void finalizaTimerJavaScript(Page sender)

{

   string scriptjs = "finalizar();";

   ScriptManager.RegisterClientScriptBlock(sender, sender.GetType(), Guid.NewGuid().ToString(), scriptjs, true);

}

 

 

protected void inicioTimerJavaScript(Page sender)

{

    string scriptjs = "inicio();";

    ScriptManager.RegisterClientScriptBlock(sender, sender.GetType(), Guid.NewGuid().ToString(), scriptjs, true);

}

 

Code 6

Estes dois métodos são específicos para chamar funçõesescritas em JavaScript pelo C#.NET.

Na hora de gerar o relatório, eu chamo o métodoinicioTimerJavaScript passando oparâmetro correto que é a página. Exemplo (Code 7)

 

 

protected void cmdGerarRelatorio_Click(object sender, EventArgs e)

        {

            if (Page.IsValid)

            {

                try

                {

                    GerarRelatorio();

                    Timer1.Enabled = true;

 

                    pnlClock.Visible = true;

                    inicioTimerJavaScript(this.Page);

                }

                catch (Exception ex)

                {

                    throw ex;

                }

            }

        }

Code 7

Note que habilito o Timer1, mostro o painelClock e inicio a contagem chamando o método inicioTimerJavaScript(this.Page).Automaticamente a página inicia o contador.

No caso de querer atualizar a página clicandoem algum outro botão, ou recarregando a página basta finalizar o tempo nojavascript. (Code 8).

 

 

protected void cmbAgencia_SelectedIndexChanged(object sender, EventArgs e)

        {

              pnlClock.Visible = false;

            finalizaTimerJavaScript(this.Page);

        }

Code 8.

Neste caso, ao selecionar uma comboautomaticamente o clock sumirá e será finalizado o tempo javascript na tela.

 

Espero ter ajudado e qualquer dúvida podeentrar em contato.

voltar   comente  subir

 
Mauricio Junior Formado pela Faculdade Anhanguera, Especialista pela FGV (Fundação Getúlio Vargas), Pós-Graduação em Docência Superior e cursando Mestrado na UNB Engenharia Elétrica; .
Tenho 29 anos e possuo sete livros publicados pela editora Ciência Moderna. Sou Certificado Microsoft MCP, MCAD e MVP, faço parte da comunidade ASPNETI.COM, ECODE10.COM, onde publico artigos, vídeos, ebooks e livros Publico artigos, vídeos e podcast em outras comunidades. Trabalho como Analista de Sistemas / Desenvolvedor na empresa ATP S/A. Blog: blog.mauriciojunior.org, Site pessoal www.mauriciojunior.org



Comentários:

Comente (dê sua opinião):
Comentário:
Código Imagem:  (digite o código da imagem respeitando maiúsculo e minúsculo)

Favor digitar o código da imagem para cadastramento.

 

Outros Artigos do Autor

Ajax parte II
Clique ENTER usando C#.NET
Vídeo mostrando como validar vários formulários
Usando Tooltip
Botão abrindo janela de forma modal
IsDecimal
Vídeo HTC
Novo Firefox 3.0 - o chamado Minefield
Criptografia de String de Conexão no Web.Config
Sistema de Login em ASP – Parte VI
Dispositivos inteligentes a caminho da sua casa
Vídeo - Microsoft Surface: The Power
CRIANDO MENU DINÂMICO COM C#.NET Passo 1
Adicionar uma coluna em um DataTable
Windows 7 funciona até no Mac
Pegando dados do computador facilmente via software
Orientação a Objetos - Microsoft PetShop 3.0
Orientação a Objetos com Visual Studio.NET (parte 2)
Gerando instalador de serviço
Tecla ESC na tela WEB
Chamando Programas de Dentro do Windows Forms
Pagamento via celular
Usando PopupControlExtender
Educação no Brasil
Search do Windows Live em Seu Site
Vídeo: Série Atlas.NET - Parte II
Moving to Visual Studio 2010 e-Book
Vídeo Sobre Atributes e String Builder com Visual Studio .NET 2005
Pegando IP da Máquina com CSharp
Mais detalhes sobre o HTC Touch HD 2 com o possível Windows Mobile 7
Inserindo valor na combo depois de preenchida
Arrumando seu Desktop
Sistema de Login – Parte IV
Virtual Earth - Segundo Passo
Método MD5