[JAX] Aggiornare progresso elaborazione con contatore

lunedì 24 agosto 2009 - 11.04

gigi90 Profilo | Senior Member

Salve a tutti, vi pongo il problema in maniera molto semplice: ho un pulsante che lancia un ciclo For fino ad N, io vorrei che ad ogni iterazione del ciclo For si aggiornasse una label che visualizza il contenuto della mia variabile del ciclo.
Come posso realizzare un qualcosa del genere con AJAX di ASP.NET.

roma.salvatore Profilo | Newbie

Label lbl = new Label();
lbl.ID = "lblMsg";
lbl.Text = "Premi il bottone..";

Button btn = new Button();
btn.ID = "btnTest";
btn.CommandArgument = "Ciao, sono dinamico";
btn.Text = "Premi qui";

// Lego all'evento click del bottone il metodo di gestione in modo dinamico

btn.Command += new CommandEventHandler(btn_Command);

// Inserisco i controlli dinamicamente nel placeholder contenuto nell’update panel

PlaceHolder1.Controls.Add(btn);
PlaceHolder1.Controls.Add(lbl);

A questo punto non resta che aggiungere il codice per il gestore d'evento che verrà chiamato al click del bottone, il quale essendo all'interno di un Update Panel non provocherà il postback della pagina ma l'aggiornamento del solo contenuto dell'Update Panel..



void btn_Command(object sender, CommandEventArgs e)
{
// Recuper il riferimento alla Label caricata dinamicamente nel PlaceHolder

Label lbl = PlaceHolder1.FindControl("lblMsg") as Label;
if (lbl != null)
lbl.Text = e.CommandArgument.ToString();
}

Gluck74 Profilo | Guru

si.... questa è una soluzione.........
però in questo caso si utilizza il rendering parziale, e non Ajax puro.
A parete l'errore di concetto: con questo esempio per vedere avanzare il numero nella label bisogna ogni volta cliccare il pulsante.
Il ciclo for sarebbe comunque completo quando la pagina fa il renderig dell'UpdatePanel.

faccio una descrizione di concetto per ora. Se riesco a ricavare un po di tempo e fare un test, riporterò anche la soluzione.
Io userei ajax puro, quindi un webMethod o un PageMethod.
Ci vuole anche un meccanismo che rilasci un evento per la pagina.
Il bottone deve quindi richamare il web/page method, che all'interno avrà dunque il ciclo for.
Adesso ci vuole, per ogni iterazione, un evento che torna in dietro alla pagina e faccia dunque scattare il gestore (handler).
Nel gestore si legge dunque il valore della label e si incrementa di 1.
La parte che ora mi sfugge (ma spero di riuscire con un esempio) è proprio questa: creare una funzione di callBack per aggiornare la label che viene richamata dal ciclo for.
Spero di scrivere presto la soluzione

Gluck74 Profilo | Guru

Dunque, ho fatto un po di ricerca e.........
purtroppo non si può esporre degli eventi da un webService ad un client. (o perlomeno non ho trovato nulla)
L'unica soluzione sarebbe utilizzare WCF che permette di fare una comunicazione più complessa.

Però utilizzando un'escamotage si potrebbe simulare l'aggiornamento, ma rimane pur sempre un "pezza".

L'idea sarebbe di utilizzare lato javascript un timer che richiama periodicamente un secondo metodo che va a controllare lo stato del primo.
Naturalmente questo è inutile quando il primo metodo esegue una procedura veloce.

Tirando le somme:
La pagina richama il metodo (page o web) tramite javascript che esegue l'operazione principale e memorizza lo stato di avanzamento
la pagina aspx istanzia un timer javascript che richiama un secondo metodo che legge semplicemente lo stato di avanzamento
la funzione legata all'evento onsuccess del secondo metodo aggiorna la pagina HTML
la funzione legata all'evento onsuccess del primo metodo ferma il timer e conclude l'aggiornamento della pagina HTML

Questa la soluzione a grandi linee, sfruttando ajax pure e richieste asincrone "vere".


Ho trovato un esempio che utilizza questa stessa idea:
http://mattberseth.com/blog/2008/07/aspnet_file_upload_with_realti.html

Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2023
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5