__doPostBack

martedì 30 ottobre 2007 - 09.48

memmo77 Profilo | Expert

Dovrei far caricare un'immagine, tipo caricamento in corso, durante una elaborazione. Solo che non riesco a farla visualizzare, la funzione parte ma l'immagine non viene caricata. Stavo vedendo la funzione __doPostBack per gestire la cosa, ma non riesco. La funzione parte qui:
If Not Page.IsPostBack Then
E quando finisce chiudo la pagina quindi se metto una funzione all' onload della pagina l'immagine non viene carica, la funzione parte, la pagina resta bianca e finita l'elaborazione si chiude. Avete qualche suggeriemento? La funzione sta in una finestra popup che viene lanciata da un altro form e quindi non ho un pulsante sulla pagina. Grazie a tutti

pozzoli.samuele Profilo | Senior Member

>Dovrei far caricare un'immagine, tipo caricamento in corso, durante
>una elaborazione. Solo che non riesco a farla visualizzare, la
>funzione parte ma l'immagine non viene caricata. Stavo vedendo
>la funzione __doPostBack per gestire la cosa, ma non riesco.
>La funzione parte qui:
>If Not Page.IsPostBack Then
>E quando finisce chiudo la pagina quindi se metto una funzione
>all' onload della pagina l'immagine non viene carica, la funzione
>parte, la pagina resta bianca e finita l'elaborazione si chiude.
>Avete qualche suggeriemento?

Ah, bhè... Certo!
La tua analisi è corretta...

Perchè non fai questa cosa carina con AJAX, nella pagina che ti chiama il popup?

Esiste un controllo carino (updateprogress) che ti visualizza un pannello solo durante l'update di una pagna.

Eventualmente ci si pensa... Se vuoi.

Altrimenti hai un'altra possibilità!

Carichi la pagina del popup, completamente, compresa l'immagine e in fondo alla pagina fai un httppost con javascript. Aspetti la risposta e infine chiudi la pagina.

Spero di averti detto abbastanza... e abbastanza chiaramente... :D

>La funzione sta in una finestra
>popup che viene lanciata da un altro form e quindi non ho un
>pulsante sulla pagina. Grazie a tutti

memmo77 Profilo | Expert

Mi hai detto abbastanza, ma ad essere sincero mi interesserebbe la parte in Ajax . Se hai qualcosa in + mi faresti sapere? Grazie mille ciao

pozzoli.samuele Profilo | Senior Member

Allora, per prima cosa, devi scaricare ed installare ajax e puoi farlo dal sito ajax.asp.net.

Poi devi abilitare il tuo sito web per ajax!

Per fare questo devi modificare il web.config, ed è un lavoraccio brutto bruttto... Perchè non c'è una vera e proprio procedura automatica.

Crei un nuovo sito ajax (Installato ajax, compare nei progetti web, la dicitura ASP .NET AJAX Enabled Web Site), e copi tutto ciò che non c'è nel tuo web.config, che però c'è nel web.config del sito ajax.

A questo punto hai un sito AJAX Enabled.

Dovrebbe comparirti una toolbox ajax... Se non ti copare apriamo un altro thread per come fare ad installarla, che non è questo il posto giusto.... (poi ci mettiamo anche il toolbox, che ci sono un sacco di cose carine!

Nella pagina, poi... devi mettere 3 oggetti, per fare questa cosa:

Uno script manager, che in sintesi è tutto il framework lato client, cioè un insieme di funzioni javascript prescritte da Microsoft.

Un update panel, che definisce la parte di pagina da aggiornare

Un update progress, che è quello che ci interessa...

Facciamo con un esempio che si fa prima!!!

<asp:Content ID="Content2" ContentPlaceHolderID="Operazioni" runat="Server"> <asp:ScriptManager ID="ScriptManager1" runat="server"> </asp:ScriptManager> <asp:UpdateProgress ID="UpdateProgress1" runat="server"> <ProgressTemplate> <!--Immagine che vuoi vedere durante l'upload--> </ProgressTemplate> </asp:UpdateProgress> <asp:UpdatePanel ID="UpdatePanel1" runat="server"> <ContentTemplate> <!--PArte di pagina che vuoi aggiornare--> </ContentTemplate> <Triggers> <!--Eventi che scatenano l'aggiornamento della pagina--> </Triggers> </asp:UpdatePanel> </asp:Content>

Proviamo a cominciare così, che son già stato troppo lungo! Fammi sapere se funziona e se riesci a combinare somthing!

memmo77 Profilo | Expert

Allora ho installato ajax, ho aggiornato il webconfig ho messo il codi, non tutto tuto ancora, ho inserito l'immagine e messo

<asp:UpdatePanel ID="UpdatePanel1" runat="server">


</asp:UpdatePanel>

questo gestirà la mia elaborazione.Solo che ho provato ad avviarlo ma l'immagine, un swf in realtà, non si vede, come mai? E cosa intendi per?

<Triggers>
<!--Eventi che scatenano l'aggiornamento della pagina-->
</Triggers>

Grazie mille, per il momento mi hai aperto un nuovo orizzonte ;)


Questo il codice che sto usando:


<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
<title>Pagina senza titolo</title>
</head>
<body>
<form id="form1" runat="server">
<asp:ScriptManager ID="ScriptManager1" runat="server" />
<div>
<asp:UpdateProgress ID="UpdateProgress1" runat="server">
<ProgressTemplate>
<object codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=7,0,19,0" align="absMiddle" classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"
viewastext style="width: 805px; height: 502px">
<param name="_cx" value="10583">
<param name="_cy" value="5292">
<param name="FlashVars" value="">
<param name="Movie" value="immagini/ATTENDERE.swf">
<param name="Src" value="immagini/ATTENDERE.swf">
<param name="WMode" value="Transparent">
<param name="Play" value="-1">
<param name="Loop" value="-1">
<param name="Quality" value="High">
<param name="SAlign" value="">
<param name="Menu" value="-1">
<param name="Base" value="">
<param name="AllowScriptAccess" value="">
<param name="Scale" value="ShowAll">
<param name="DeviceFont" value="0">
<param name="EmbedMovie" value="0">
<param name="BGColor" value="">
<param name="SWRemote" value="">
<param name="MovieData" value="">
<param name="SeamlessTabbing" value="1">
<param name="Profile" value="0">
<param name="ProfileAddress" value="">
<param name="ProfilePort" value="0">
<param name="AllowNetworking" value="all">
<embed src="immagini/ATTENDERE.swf" width="400" height="200" align="absmiddle" quality="high"
pluginspage="http://www.macromedia.com/go/getflashplayer" type="application/x-shockwave-flash">
</embed>
</object>
</ProgressTemplate>
</asp:UpdateProgress>
<asp:UpdatePanel ID="UpdatePanel1" runat="server">


</asp:UpdatePanel>

</div>
</form>
</body>
</html>

pozzoli.samuele Profilo | Senior Member

Perfetto. E' esattamente quello che dovevi fare.

I triggers, sono per metterci gli oggetti (in realtà riferimenti ad eventi di oggetti) che stanno fuori dall'update panel che in realtà scateneranno l'aggiornamento proprio del pannello.

Vediamo... Dici che non si vede... Ma tutto questo ambaradam... Dove l'hai messo?

Questa soluzione (forse non l'ho chiarito troppo bene) prevede che questo ambaradam, stia nella pagina principale. Non funziona nel pop-up, per le stesse ragioni della tua precedente soluzione.

Quindi, il pulsante, link, bottone... che ti apre il popup, dovrebbe stare nell'update panel.

Altra cosa ovvia... Solo se l'operazione è lunga, ti compare il filmato. In sintesi... Tu fai il postback, viene visualizzato il pannello, scarica il swf e lo mostra.... Nel frattempo, avviene il postback dei dati.

Se il postback, finisce prima del download dell'swf, non riesce a comparire, perchè viene chiuso prima.

Eventualmente se posti uno zip con i sorgenti, vedo se riesco a darci un'occhio. Credo domani a mezzogiorno... Poi parto per i monti...

Relax this weekend!

memmo77 Profilo | Expert

Ecco perchè, io l'ho rimessa nella popup . Domani faccio le modifiche e ti faccio sapere. Ancora mille grazie

memmo77 Profilo | Expert

Ho fatto quello che mi hai detto, ho messo gli eventi nella pagina e non in un popup. Questa una parte html:

<asp:ScriptManager ID="ScriptManager1" runat="server">
</asp:ScriptManager>


<tr height="1%">
<td align="left" colspan="5" style="height: 1%">
<asp:UpdatePanel ID="UpdatePanel1" runat="server">
<ContentTemplate>
&nbsp;<asp:Button ID="cmd_AllRdl" runat="server" Text="Bilancio in PDF" />&nbsp;
</ContentTemplate>
<Triggers>
</Triggers>
</asp:UpdatePanel>
&nbsp;
</td>
</tr>
<tr>
<td align="left" colspan="5" style="height: 1%">
<asp:UpdateProgress ID="UpdateProgress1" runat="server">
<ProgressTemplate>
&nbsp;<img src="immagini/barra_blu.gif" />
</ProgressTemplate>
</asp:UpdateProgress>
&nbsp;
<msg:Messaggio ID="Messaggio" runat="server" Width="50px" Height="8px"></msg:Messaggio>
</td>
</tr>

In pratica, avvio la pagina e la barra_blu.gif non si vede. Al click del bottone dovrei far apparire l'immagine e far partire l'elaborazione ma non ci riesco. Al click del bottone ho aggiunto:

UpdateProgress1.DataBind()

UpdatePanel1.DataBind()

E all'interno di queste ho messo UpdateProgress1.Visible = True, ma niente da fare. Mi sto letteralmente "incartando" . Sai dirmi dove sbaglio? Grazie mille ciao

ps. beato teeeee che vai in montagna



Allora altro progresso. La funzione parte i miei pdf vengono generati, non vedo comunque la barra di progresso e non riesco a fare ne Response.Write ne Response.Redirect del mio pdf mi esce un errore che parla di parse di ajax, sai dirmi qualcosa? Grazie ciao

pozzoli.samuele Profilo | Senior Member

>Ho fatto quello che mi hai detto, ho messo gli eventi nella pagina
>e non in un popup. Questa una parte html:
>
> <asp:ScriptManager ID="ScriptManager1" runat="server">
> </asp:ScriptManager>
>
>
> <tr height="1%">
><td align="left" colspan="5" style="height: 1%">
><asp:UpdatePanel ID="UpdatePanel1" runat="server">
> <ContentTemplate>
> <asp:Button ID="cmd_AllRdl" runat="server" Text="Bilancio
>in PDF" /> 
> </ContentTemplate>

Se il pulsante è dentro al content template... I triggers puoi toglierli.

> <Triggers>
> </Triggers>

Quindi fino a qui.

> </asp:UpdatePanel>
>  
> </td>
> </tr>

Non ti conviene metterla sopra questa riga?

Almeno, quando compare il template, ti sposta in giù il bottone...

> <tr>
><td align="left" colspan="5" style="height: 1%">
><asp:UpdateProgress ID="UpdateProgress1" runat="server">
> <ProgressTemplate>
> <img src="immagini/barra_blu.gif" />
> </ProgressTemplate>
> </asp:UpdateProgress>
>  

Il messaggio è il risultato dell'operazione, quindi. Sarebbe meglio metterlo dentro il content template, che altrimenti non ti viene aggiornato dalle procedure di risposta di ajax...

><msg:Messaggio ID="Messaggio" runat="server" Width="50px"
>Height="8px"></msg:Messaggio>
> </td>
> </tr>
>
>In pratica, avvio la pagina e la barra_blu.gif non si vede. Al
>click del bottone dovrei far apparire l'immagine e far partire
>l'elaborazione ma non ci riesco.

> Al click del bottone ho aggiunto:
>
> UpdateProgress1.DataBind()
>
> UpdatePanel1.DataBind()


Non serve! Perchè Mai? Non li hai connessi ad un database!

>
>E all'interno di queste ho messo UpdateProgress1.Visible = True,

No, no.. Non serve!

>ma niente da fare. Mi sto letteralmente "incartando" . Sai
>dirmi dove sbaglio? Grazie mille ciao

Il progress template, dovrebbe partire da solo!

>
>ps. beato teeeee che vai in montagna

Spero proprio... Devo vedere se tutto gira come deve oggi...

>
>
>
>Allora altro progresso. La funzione parte i miei pdf vengono
>generati, non vedo comunque la barra di progresso e non riesco
>a fare ne Response.Write ne Response.Redirect del mio pdf mi
>esce un errore che parla di parse di ajax, sai dirmi qualcosa?

Certo. Non puoi fare in ajax un response.redirect. Stai aggiornando solo una parte della pagina, quindi non puoi redirigerla!
Per il response.write, stessa cosa!
Per scrivere sulla pagina, ti conviene mettere una label all'interno dell'update panel. Considera che, volendo, puoi metterci tutta la pagina in un update panel.
E per la barra di progresso... Ho paura che sia difficile farla!

Però possiamo tentare. Cerchiamo prima di far comparire l'immagine.

Prova a mettera nel bottone un system.threading.thread.sleep(5000) (Ferma l'esecusione della pagina * 5 sec.... Vediamo che succede.

>Grazie ciao
>

memmo77 Profilo | Expert

Rientrato dalle ferie?? Senti, sono riuscito nell'opera ho messo la mia funzione e avviato la gif animata. Solo ora stavo complicandomi la vita . Volevo mettere al posto della gif animata una barretta che mi desse l'avanzamento della mia elaborazione. Solo che non riesco ad aggiornare la funzione javascript che dovrebbe aggiornare la barretta. Questa le funzioni che uso:

<asp:ScriptManager ID="ScriptManager1" runat="server">
</asp:ScriptManager>
<script language="JavaScript">
var prm = Sys.WebForms.PageRequestManager.getInstance();
prm.add_initializeRequest(InitializeRequest);
prm.add_endRequest(EndRequest);

function InitializeRequest(sender, args) {
document.body.style.cursor = "wait";
}

function EndRequest(sender, args) {
//controllaProgres("100%");
document.body.style.cursor = "default";
var id_abi = "<%=session("var")%>";
var pagina = "http://localhost/miosito/miofile.pdf"
window.open(pagina);
}

function Progress(){
//setTimeOut("controllaProgres()",1000);
//controllaProgres();
debugger;
var input = "<%=Session("Percentuale1")%>";
elem = document.getElementById("Image1");
elem.style.width = "100px";
return false;
//do {
//var input = "<%=Session("Percentuale1")%>";
//controllaProgres(input)
//} while (input = "100")
//controllaProgres("50%");

}
</script>

Praticamente la "<%=Session("Percentuale1")%>" non si aggiorna, mentre da vb si aggiorna invece. Che devo fare? Grazie ciao

pozzoli.samuele Profilo | Senior Member

>Rientrato dalle ferie?? Senti, sono riuscito nell'opera
>ho messo la mia funzione e avviato la gif animata. Solo ora stavo
>complicandomi la vita . Volevo mettere al posto della gif
>animata una barretta che mi desse l'avanzamento della mia elaborazione.
>Solo che non riesco ad aggiornare la funzione javascript che
>dovrebbe aggiornare la barretta.

...

>Praticamente la "<%=Session("Percentuale1")%>" non si aggiorna,
>mentre da vb si aggiorna invece. Che devo fare? Grazie ciao

K... vuoi fare una barra di avanzamento del processo. Di upload o di generazione del pdf.

Non è così semplice. Infatti, esistono pacchetti software che si fammo pagare e anche bene!

Il problema è che tu premi un bottone. Lanci le tue procedure etc etc etc...

Analiziamo cosa succede.
Quando tu premi un bottone, parte un postback, che dura per tutto il tempo che sul server vengono eseguite le operazioni. Indipendentemente dal fatto che siano in una funzione o in una sub o altro, il postback, finisce quando tutte le operazioni sono finite.

Il problema è che la pagina viene aggiornata solo alla fine del postback.

Risulta quindi impossibile effettuare comunicazioni durante questa fase di postback tra client e server e quindi non riesci ad inviare nemmeno questi dati: quanto deve essere riempita la barra.

Ora... Una soluzione forse esiste. Quella di lanciare le operazioni che devi fare sul server... in un thread. A questo punto, il postback della pagina è istantaneo. Puoi fare un refresh della pagina (Sempre tramite AJAX) e chiedere a che punto devi caricare la barra. Complicato! Decisamente. Però potrebbe funzionare.

E' un'ipotesi decisamente da studiare.

memmo77 Profilo | Expert

Quindi che tu sappia non c'è modo tramite ajax di aggiornare una variabile in "tempo reale" :(. Il thread l'ho usato per fare la barretta come dici te e funziona, solo e rognosetto da gestire, soprattutto i fase di eccezione.

Una domanda extra. Quando faccio il pacchetto di installazione devo aggiungere qualcosa per utilizzare l'ajax? Ti dico questo perchè ho provato a mettere l'applicazione su un servere ma mi ha dato un errore sul webconfig, mentre in locale funziona correttamente. Grazie mille

pozzoli.samuele Profilo | Senior Member

Certo! Sul server, come sul client, deve essere installato ajax! Detto ciò non so se c'è modo di mettere nelle installazioni dei siti ajax. Sviluppo con la vers express, quindi i trasferimenti sono sempre via ftp, pagina per pagina... Mai fatto installazioni.

Se tipo... sei su aruba... le mie apps funzianano. C'è già installato.

L'installazione, cmq, ti mette le librerie dove servono.

Pierpaolo82 Profilo | Newbie

Ciao...scusate sono arrivato tardi...
mi spiegate alla fine come avete fatto la barra di caricamento di un file??
grazie...

memmo77 Profilo | Expert

Allora c'è un metodo che è quello di usare un thread che calcola la barra esattamente in base ai cicli della tua elaborazione. Un altro è quello di usare ajax ma io personalmente sono riuscito solo a fari visualizzare una gif animata durante l'elaborazione. Ciao

ravalon Profilo | Expert

intervengo per il problema della barra di avanzamento...

qui ne trovi una per ajax....è una semplice anigif... non so se ti può servire...

http://www.ajaxload.info/#preview
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-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5