31 messaggi dal 16 marzo 2005
www.seodev.it
Salve, dopo ore di ricerche e tentativi non andati a buon fine, eccomi ricorrere al vostro aiuto, in particolare vi spiego il mio problema...
sto cercando di stampare il contenuto di una mia gridview "telaiGVIEW" che ha il paging attivato.
Ho creato i classici pulsanti "stampa pagina corrente" e "stampa tutto".

Per poter stampare tutto devo, lato code behind, disattivare il paging della gridview, fare il binding della gridview e richiamare la funzione
ScriptManager.RegisterStartupScript(this, this.GetType(), "", "PrintGridData('telaiGVIEW')", true);

che mi permette di avere a video i classici menu di stampa.

Fatto ciò devo riattivare il paging della gridview e tutto dovrebbe ritornare normale, ma non è così, quello che avviene è che il primo
telaiGVIEW.AllowPaging = false;
è come se venisse ignorato e viene visto solo il secondo :
telaiGVIEW.AllowPaging = true;
.

Per praticità vi allego il code behind del mio pulsante:
        
telaiGVIEW.AllowPaging = false;
telaiGVIEW.DataBind();

ScriptManager.RegisterStartupScript(this, this.GetType(), "", "PrintGridData('telaiGVIEW')", true);

telaiGVIEW.AllowPaging = true;
telaiGVIEW.DataBind();


il problema è che in questo modo mi viene stampato solo la prima pagina della gridview e non tutto perchè il paging è come se non venisse disattivato, ma se elimino la parte finale del codice:

        
telaiGVIEW.AllowPaging = true;
telaiGVIEW.DataBind();


tutto viene stampato correttamente ma la gridview mi rimane senza il paging attivato.

cosa può essere?
grazie per l'aiuto.
11.886 messaggi dal 09 febbraio 2002
Contributi
Ciao,

ragraphics ha scritto:

è come se venisse ignorato e viene visto solo il secondo :

Esatto, perché la stampa avviene lato client e ciò si può verificare solo dopo che la pagina è stata completamente generata.

Il fatto che invochi RegisterStartupScript lì in mezzo, non significa che la funzione javascript PrintGridData venga effettivamente eseguita in quel momento. Infatti l'HTML della pagina non è stato ancora generato né inviato al client, quindi la stampa non può avvenire.
Il metodo si chiama appunto "Register..." perché la funzione javascript viene solo registrata e non eseguita.

Quindi, il codice del tuo pulsante viene eseguito per intero e, solo al termine, ASP.NET si mette a renderizzare la tua pagina in modo che possa produrre l'HTML da mandare al client. Il primo databinding con AllowPaging = false a questo punto è inutile perché lo stato della GridView viene reimpostato subito dopo, al secondo DataBind.

Se vuoi che l'utente possa stampare qualcosa, deve necessariamente essere presente nella pagina.

Se preferisci non mostrare all'utente la gridview nella sua interezza, potresti fare in modo che il button causi un postback verso un <iframe> nascosto. Prova ad aggiungere questo:
OnClientClick="this.form.target ='stampa';"

Dove 'stampa' è il name di un iframe che nascondi col css.
Ricordati di riportare il form.target su '_self', altrimenti tutte le altre operazioni (ad esempio il cambio pagina della GridView), continueranno ad essere inviate verso l'iframe nascosto.

ciao,
Moreno
Modificato da BrightSoul il 26 settembre 2015 15.54 -

Enjoy learning and just keep making
31 messaggi dal 16 marzo 2005
www.seodev.it
Ciao Moreno,
grazie per il suggerimento ;)
al momento ho creato e nascosto un iframe con un controllo gridview "stampaGVIEW" al suo interno, che popolo lato code behind.
ho aggiunto il codice:
this.form.target ='stampa';

ma adesso se volessi far puntare la struttura javascript verso "stampaGVIEW come posso fare?

il mio codice javascript è il seguente:
  <script type="text/javascript">
    function PrintGridData(nomeGview) {
        var prtGrid = document.getElementById(nomeGview);

        var intNumberOfRows = prtGrid.rows.length;
        prtGrid.rows[intNumberOfRows - 1].style.visibility = 'hidden';
        prtGrid.rows[intNumberOfRows - 1].style.display = 'none';

        prtGrid.border = 0;
        var prtwin = window.open('stampa', 'PrintGridViewData', 'left=100,top=100,width=1000,height=1000,tollbar=0,scrollbars=1,status=0,resizable=1');
        prtwin.document.write(prtGrid.outerHTML);
        prtwin.document.close();
        prtwin.focus();
        prtwin.print();
        prtwin.close();
    }
  </script>

e viene eseguito attraverso la seguente chiamata:
PrintGridData('stampaGVIEW');

grazie mille.
Antonio
11.886 messaggi dal 09 febbraio 2002
Contributi
Ciao Antonio,
la pagina che apri nell'iframe nascosto può essere in tutto e per tutto uguale a quella che l'utente vede a schermo, con l'unica differenza che la GridView conterrà tutte le righe anziché solo una pagina.

Comunque, se hai deciso di creare una pagina apposita che contiene solo la "stampaGVIEW", non ti resta che spostare il codice javascript in questa pagina. Potresti semplificarlo così:
function PrintGridData() {
        window.print();
}

...dato che, mi è parso di capire, hai creato una pagina contenente solo "stampaGVIEW". Se così non fosse, la soluzione si applica comunque se nascondi col CSS gli elementi che vuoi nascondere nella stampa (mentre restano visibili per il monitor).

Qui trovi un esempio di come puoi nascondere gli elementi HTML per la stampa (e non per il monitor).
http://www.div-tags.com/css3/hide-dom-elements-css-printing/

ciao,
Moren
Modificato da BrightSoul il 27 settembre 2015 20.54 -

Enjoy learning and just keep making

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.