+ Rispondi al Thread
Pagina 1 di 2 12 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 14

Discussione: contatore countdown

  1. #1
    massimoflorian non è in linea Scolaretto
    Post
    267

    contatore countdown

    salve a tutti, avrei un piccolo problema:
    ho realizzato un contatore che conta da n secondi sino a 0.
    finquì tutto ok.
    quando provo ad eseguire la stessa operazione all'inteno di un data list non funziona niente.
    il codice sottostante funziona.
    codice:
    
    ProtectedSub Timer1_Tick(ByVal sender AsObject, ByVal e As System.EventArgs) Handles Timer1.Tick
    Dim seconds AsDouble = Double.Parse(Label1.Text)
    If seconds > 0 Then
    Label1.Text = (seconds - 0.5).ToString()
    Else
    Timer1.Enabled = False
    EndIf
    EndSub
    
    ma quando provo a fare la stessa operazione all'interno di un datalist il contatore non funziona:
    codice:
    
    <asp:ScriptManagerID="ScriptManager1"runat="server">
    </asp:ScriptManager>
    <div>
    
    <asp:DataListID="DataList1"runat="server"DataKeyField="ID" 
    DataSourceID="AccessDataSource1"RepeatColumns="4"RepeatDirection="Horizontal" 
    Width="758px">
    <ItemTemplate>
    ID:
    <asp:LabelID="IDLabel"runat="server"Text='<%# Eval("ID") %>'/>
    <br/>
    Prezzo1:
    <asp:LabelID="Prezzo1Label"runat="server"Text='<%# Eval("Prezzo1") %>'/>
    <br/>
    NumSecondi:
    <asp:LabelID="NumSecondiLabel"runat="server" 
    Text='<%# Eval("NumSecondi") %>'/>
    <br/>
    Prodotto:
    <asp:LabelID="ProdottoLabel"runat="server"Text='<%# Eval("Prodotto") %>'/>
    <br/>
    <br/>
    <asp:UpdatePanelID="UpdatePanel1"runat="server">
    <ContentTemplate>
    <asp:TimerID="Timer1"runat="server">
    </asp:Timer>
    <asp:TextBoxID="TextBox1"runat="server"Height="22px" 
    Text='<%# Eval("NumSecondi") %>'Width="65px"></asp:TextBox>
    </ContentTemplate>
    </asp:UpdatePanel>
    <br/>
    </ItemTemplate>
    </asp:DataList>
    
    codice:
    
    ProtectedSub Timer1_Tick(ByVal sender AsObject, ByVal e As System.EventArgs) Handles Timer1.Tick
    Dim seconds AsDouble = Double.Parse(TextBox1.Text)
    If seconds > 0 Then
    TextBox1.Text = (seconds - 0.5).ToString()
    Else
    Timer1.Enabled = False
    EndIf
    EndSub
    
    qualcuno può darmi un aiutino?
    Vi ringrazio anticipatamente.

  2. #2
    L'avatar di bumm
    bumm non è in linea Very Important Person Ultimo blog: [VB2010] ComboBox ed Enumeratori
    Luogo
    Bologna
    Post
    2,142
    Blogs
    1
    Rispondo a questa discussione un po datata, per la richiesta dell'utente.

    Usare il timer lato server - non è una buona soluzione. se hai una quantita modesta dei records moltiplicata per tutti gli utenti che consultano la pagina - avrai tanti timer da gestire, (oltre a spedire i dati ogni secondo!). Quindi lasciamo questo lavoro al javascript lato client:

    Dal codice puoi notare che ho aggiunto il campo [Intervallo] nella query e fisicamente nel database.

    Nel esempio ho utilizzato jQuery - il framework per javascript che e free: jQuery: The Write Less, Do More, JavaScript Library

    codice:
    <%@ Page Language="vb" AutoEventWireup="false" CodeBehind="Default.aspx.vb" Inherits="timer._Default" %>
    
    <!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 runat="server">
        <title></title>
        <%-- serve per caricare jquery framework --%>
        <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.3/jquery.min.js" type="text/javascript"></script>
    
        <script type="text/javascript">
            var timers = new Array();
            var interval = 1000;
           // nel momento i qui sono stati caricati tutti i documenti
            $(document).ready(function () {
                //trova tutti gli elementi con classe uguale a "TimerElement"
                $(".TimerElement").each(function (i) {//questa funzione viene eseguita per ogni elemento trovato
                    //valore attuale dell'elemento
                    var tte = $(this).html();
                    //idi dell'elemento attuale
                    var elId = $(this).attr("id");
                    //creo l'elemento di timeout
                    var t = setTimeout("timedCount('" + elId + "'," + tte + ", " + i + ")", interval);
                    //assegno handler al array degli elementi
                    timers.push(t);
                });
    
            });
    
            //questo è il handler dell'evento impostato per ogni elemento
            // i parametri sono:
            //  elId - id dell'elemento da aggiornare
            //  ind - indice del timer da aggiornare
            function timedCount(elId,  ind) {
                //troviamo il valore dell'elemento attuale
                var timeToElapse = $('#' + elId).html() - 1;
                //se il valore >= 0 aggiorniamo elemento
                if (timeToElapse >= 0) {
                    //settiamo il valore dell'elemento
                    $('#' + elId).html(timeToElapse);
                    //reimpostiamo la scadenza(intervallo)
                    timers[ind] = setTimeout("timedCount('" + elId + "'," + actual + ", " + ind + ")", interval);
                }
            }
        </script>
    </head>
    <body>
        <form id="form1" runat="server">
     <div>
       
                            <asp:ScriptManager ID="ScriptManager1" runat="server">
                            </asp:ScriptManager>
       
                            <asp:Button ID="Button1" runat="server" Text="Button" />
       
            <asp:DataList ID="DataList1" runat="server" DataKeyField="ID"
                DataSourceID="AccessDataSource1" Height="96px" RepeatColumns="4"
                RepeatDirection="Horizontal"
                style="font-family: Arial, Helvetica, sans-serif; font-size: x-small"
                Width="702px">
                <ItemTemplate>
                    Prodotto:
                    <asp:Label ID="ProdottoLabel" runat="server" Text='<%# Eval("Prodotto") %>' />
                    <br />
                    ID:
                    <asp:Label ID="IDLabel" runat="server" Text='<%# Eval("ID") %>' />
                    <br />
                    DescrizioneBreve:
                    <asp:Label ID="DescrizioneBreveLabel" runat="server"
                        Text='<%# Eval("DescrizioneBreve") %>' />
                    <br />
                        <asp:Label ID ="inputIntervallo" class="TimerElement" runat="server" Text ='<%# Eval("Intervallo") %>'></asp:Label>
                    <br />
                </ItemTemplate>
            </asp:DataList>
            <asp:AccessDataSource ID="AccessDataSource1" runat="server"
                DataFile="~/App_Data/Database.mdb"
                SelectCommand="SELECT [Prodotto], [ID], [DescrizioneBreve], [Intervallo] FROM [Prodotti]">
            </asp:AccessDataSource>
       
        </div>
        </form>
    </body>
    </html>
    "HeloWorld.exe" 17 errors, 31 warnings.

    Non mi mandate le richieste di aiuto via PM! Non vi risponderò! Tutte le domande fateli sul forum!

  3. #3
    massimoflorian non è in linea Scolaretto
    Post
    267
    ciao, grazie per la risposta.
    Volevo chiederti quando mandavo il progetto in esecuzione mi dava l'errore su
    +actual +
    ho levato questo valore ed il countdown è partito.
    Volevo chiederti quel pulsante per ripartire il conteggio è unico per tutti i record. Ma se ne volessi mettere uno per ogni record del datalist che fa ripartire solo quel record corrente e non tutti gli altri bisognerebbe rivoluzionare un pò tutto il codice o basta apportare piccole modifiche?
    Grazie anticipatamente.

  4. #4
    L'avatar di bumm
    bumm non è in linea Very Important Person Ultimo blog: [VB2010] ComboBox ed Enumeratori
    Luogo
    Bologna
    Post
    2,142
    Blogs
    1
    Ciao,
    Volevo chiederti quando mandavo il progetto in esecuzione mi dava l'errore su
    +actual +
    ho levato questo valore ed il countdown è partito.
    Giusto, ho dimenticato di toglierlo dopo una modifica successiva.

    Ma se ne volessi mettere uno per ogni record del datalist che fa ripartire solo quel record corrente e non tutti gli altri bisognerebbe rivoluzionare un pò tutto il codice o basta apportare piccole modifiche?
    emmm... un po di modifiche ci sono...
    ho cercato di commentare meglio il javascript, ma se hai delle domande, sono qui nei paraggi.
    codice:
    <%@ Page Language="vb" AutoEventWireup="false" CodeBehind="Default.aspx.vb" Inherits="WebApplication1._Default" %>
    
    <!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 id="Head1" runat="server">
        <title></title>
        <%-- serve per caricare jquery framework --%>
        <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.3/jquery.min.js" type="text/javascript"></script>
    
        <script type="text/javascript">
            var timers = new Array(); //Cambiato il tipo di array ogni elemento e un oggetto: { "ElementId": "id del elemento", "timer": "timer del elemento" }
            var values = new Array(); //Aggiunto nuovo array per salvare i valori iniziali: { "ElementId": "id del elemento", "timer", "TimeToElapse": "valore iniziale del elemento" }
            var interval = 1000;
            // nel momento i qui sono stati caricati tutti i documenti
            $(document).ready(function () {
                //trova tutti gli elementi con classe uguale a "TimerElement"
                $(".TimerElement").each(function (i) {//questa funzione viene eseguita per ogni elemento trovato
                    //valore attuale dell'elemento
                    var tte = $(this).html();
                    //idi dell'elemento attuale
                    var elId = $(this).attr("id");
                    //creo l'elemento di timeout
                    var t = setTimeout("timedCount('" + elId + "')", interval);
                    //assegno handler al elemento di array (da notare che l'elemento di array assomiglia alla KeyValuePair di una dictionary
                    timers.push({ "ElementId": elId, "timer": t });
                    //passo il valore in un array(server per resettare il timer con un valore iniziale)
                    values.push({ "ElementId": elId, "TimeToElapse": tte });
                });
    
            });
    
            //questo è il handler dell'evento impostato per ogni elemento
            // i parametri sono:
            //  elId - id dell'elemento da aggiornare
            function timedCount(elId) {
                //troviamo il valore dell'elemento attuale
                var timeToElapse = $('#' + elId).html() - 1;
                //se il valore >= 0 aggiorniamo elemento
                if (timeToElapse >= 0) {
                    //settiamo il valore dell'elemento
                    $('#' + elId).html(timeToElapse);
                    //reimpostiamo la scadenza(intervallo)
                    for(var i=0; i < timers.length; i++){
                          if( timers[i].ElementId ==elId){
                              timers[i].timer = setTimeout("timedCount('" + elId + "')", interval);
                              return;
                          }
                    }
                   
                }
              }
    
            //la nuova funzione di reset del timer di un elemento con un ID specifico
            function resetTimer(elId) {
                //ricerca del valore dell'elemento con un ID specifico
                for(var i=0; i < values.length; i++){
                    if(values[i].ElementId == elId){
                        var tte = values[i].TimeToElapse
                        //assegnazione del valore di inizializzazione al elemento con un ID specifico
                        $('#' + elId).html(tte);
                        //ricerca del timer di un elemento con un ID specifico
                        for(var j=0; j < timers.length; j++){
                            if (timers[j].ElementId == elId) {
                              //restart del timer di un elemento specifico
                              timers[j].timer = setTimeout("timedCount('" + elId + "')", interval);
                          }
                    }
                        return;
                    }
                }
            }
    
        </script>
    </head>
    <body>
        <form id="form1" runat="server">
     <div>
       
                            <asp:ScriptManager ID="ScriptManager1" runat="server">
                            </asp:ScriptManager>
       
                            <asp:Button ID="Button1" runat="server" Text="Button" />
       
            <asp:DataList ID="DataList1" runat="server" DataKeyField="ID"
                DataSourceID="AccessDataSource1" Height="96px" RepeatColumns="4"
                RepeatDirection="Horizontal"
                style="font-family: Arial, Helvetica, sans-serif; font-size: x-small"
                Width="702px">
                <ItemTemplate>
                    Prodotto:
                    <asp:Label ID="ProdottoLabel" runat="server" Text='<%# Eval("Prodotto") %>' />
                    <br />
                    ID:
                    <asp:Label ID="IDLabel" runat="server" Text='<%# Eval("ID") %>' />
                    <br />
                    DescrizioneBreve:
                    <asp:Label ID="DescrizioneBreveLabel" runat="server"
                        Text='<%# Eval("DescrizioneBreve") %>' />
                    <br />
                        <asp:Label ID ="InputIntervallo" class="TimerElement" runat="server" Text ='<%# Eval("Intervallo") %>'></asp:Label>
                    <br />
                        <button type="button" onclick='javascript:resetTimer("<%# CType(container, DataListItem).FindControl("InputIntervallo").ClientID%>")'>Reset</button>
                    <br />
                </ItemTemplate>
            </asp:DataList>
            <asp:AccessDataSource ID="AccessDataSource1" runat="server"
                DataFile="~/App_Data/Database.mdb"
                SelectCommand="SELECT [Prodotto], [ID], [DescrizioneBreve], [Intervallo] FROM [Prodotti]">
            </asp:AccessDataSource>
       
        </div>
        </form>
    </body>
    </html>
    "HeloWorld.exe" 17 errors, 31 warnings.

    Non mi mandate le richieste di aiuto via PM! Non vi risponderò! Tutte le domande fateli sul forum!

  5. #5
    massimoflorian non è in linea Scolaretto
    Post
    267
    ciao bumm, grazie per il tuo intervento .codice perfetto non ho dovuto modificare neanche una virgola o adattato semplicemente il tuo codice al mio progetto.
    Grazie

  6. #6
    massimoflorian non è in linea Scolaretto
    Post
    267
    ciao bumm, ho notato che quando clicco il reset fa il countdown piu veloce del doppio sul record cliccato.

  7. #7
    L'avatar di bumm
    bumm non è in linea Very Important Person Ultimo blog: [VB2010] ComboBox ed Enumeratori
    Luogo
    Bologna
    Post
    2,142
    Blogs
    1
    Non è più veloce. l'intervallo e sempre un secondo. L'unica differenza e il momento in qui viene lanciato. Quindi ci sarà sempre un offset(costante pero) tra un timer resettato e un timer caricato.
    "HeloWorld.exe" 17 errors, 31 warnings.

    Non mi mandate le richieste di aiuto via PM! Non vi risponderò! Tutte le domande fateli sul forum!

  8. #8
    L'avatar di bumm
    bumm non è in linea Very Important Person Ultimo blog: [VB2010] ComboBox ed Enumeratori
    Luogo
    Bologna
    Post
    2,142
    Blogs
    1
    In effetti hai ragione. Ci serve il metodo clearTimeout se il conteggio non è arrivato alla fine.
    Eccoti la funzione modificata:
    codice:
            //la nuova funzione di reset del timer di un elemento con un ID specifico
            function resetTimer(elId) {
                //ricerca del valore dell'elemento con un ID specifico
                for (var i = 0; i < values.length; i++) {
                    if (values[i].ElementId == elId) {
                        var tte = values[i].TimeToElapse
                        //assegnazione del valore di inizializzazione al elemento con un ID specifico
                        $('#' + elId).html(tte);
                        //ricerca del timer di un elemento con un ID specifico
                        for (var j = 0; j < timers.length; j++) {
                            if (timers[j].ElementId == elId) {
                                //restart del timer di un elemento specifico
                                clearTimeout(timers[j].timer);
                                timers[j].timer = setTimeout("timedCount('" + elId + "')", interval);
                            }
                        }
                        return;
                    }
                }
            }
    "HeloWorld.exe" 17 errors, 31 warnings.

    Non mi mandate le richieste di aiuto via PM! Non vi risponderò! Tutte le domande fateli sul forum!

  9. #9
    massimoflorian non è in linea Scolaretto
    Post
    267
    ciao, provato perfetto.
    Soltanto un altra domanda.
    se io volessi fare vedere a tutti gli utenti collegati gli stessi secondi e qualcosa che dovrei giostrare con global.asa.
    cioe ipoteticamente partono tutti i timer resetto un solo record e tutti devono vedere che un solo record è ripartito.
    Non voglio farti perdere altro tempo vorrei sapere se dovrei giostrare con globalasa.
    Ciao grazie

  10. #10
    L'avatar di bumm
    bumm non è in linea Very Important Person Ultimo blog: [VB2010] ComboBox ed Enumeratori
    Luogo
    Bologna
    Post
    2,142
    Blogs
    1
    Quote Originariamente inviato da massimoflorian Visualizza il messaggio
    ciao, provato perfetto.
    Soltanto un altra domanda.
    se io volessi fare vedere a tutti gli utenti collegati gli stessi secondi e qualcosa che dovrei giostrare con global.asa.
    cioe ipoteticamente partono tutti i timer resetto un solo record e tutti devono vedere che un solo record è ripartito.
    Non voglio farti perdere altro tempo vorrei sapere se dovrei giostrare con globalasa.
    Ciao grazie
    La cosa diventa più complicata di quant'era all'inizio. Il problema è negli requisiti. Il mio codice fa quello che hai chiesto inizialmente, ma non va bene per quello che stai chiedendo adesso. ci vuole un concetto diverso:
    1. si deve gestire un set di timers globali(se la quantità degli ogetti del db non è costante e non è piccola, probabilmente la cosa non sarà fattibile. );
    2. si deve gestire la concorrenza nel reset;
    3. serve un WebService oppure WebHandler con seguenti metodi:
    -Metodo che restituisce il valore del timer attuale;
    -Metodo che resetta il timer
    4. La gestione del timer sul client cambia, quindi il timer serve solo per controllare il valore attuale da WebSerice o HttpHandler ogni tot di secondi e aggiornare l'elemento html.
    Naturalmente le chiamate tra WebSerice o HttpHandler e client devono avvenire tramite ajax.

    Quindi prima di chiedere aiuto, definisci bene i requisiti. Cosi evitiamo il lavoro inutile.
    "HeloWorld.exe" 17 errors, 31 warnings.

    Non mi mandate le richieste di aiuto via PM! Non vi risponderò! Tutte le domande fateli sul forum!

+ Rispondi al Thread
Pagina 1 di 2 12 ultimoultimo

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi