Gestire il pulsante di stampa in ReportViewer

martedì 02 settembre 2008 - 12.59

antoniogu83 Profilo | Newbie

Salve,
vorrei sapere se è possibile associare all'evento "click sul PrintButton di un report rdlc", un'azione definita mediante codice.
Mi spiego meglio:
il mio report si basa su una tabella in cui è presente un campo "stato" che inizialmente ha valore "ordinato" per tutti gli elementi;
cliccando sul pulsante di stampa del report, vorrei che in automatico l'attributo stato cambiasse valore da "ordinato" a "produzione" per tutti gli elementi del report stesso;
ciò è facilmente gestibile in riferimento al pulsante "refresh", poichè è associato il metodo "OnReportRefresh", ma non ho trovato niente di simile per il pulsante "print".
Qualcuno può aiutarmi?
Grazie

freeteo Profilo | Guru

ciao,
per quanto ne so io non c'è quell'evento purtroppo devi farlo tu a mano.
La strada migliore a mio avviso è farsi renderizzare il report in un formato immagine, composta da una serie di immagini quante sono le pagine, le tipiche "tiff", per poi stampare ogni pagina di questa immagine "complessa" con l'oggetto di stampa Printdocument di .net.

Cmq sia non devi preoccuparti di creare questo tipo di immagine si arrangia il report, basta invocare il metodo "Render" con un parametro stringa di formato "Image", a questo punto hai in memoria l'immagine che è fatta dalla stampa di tutte le pagine del report.
Usando le classi System Drawing vai a fare la stampa di queste, pagina per pagina.

Tante chiacchiere di concetto, ma che si traducono in questo codice abbastanza semplice:

List<Image> pagine = new List<Image>(); int pagina = 0; private void stampaButton_Click(object sender, EventArgs e) { LocalReport report = reportViewer1.LocalReport; //---queste ci vogliono string mimeType; string encoding; string fileNameExtension; string[] streams; Warning[] warnings; byte[] bytes = report.Render( "Image", null, out mimeType, out encoding, out fileNameExtension, out streams, out warnings); Image image = Image.FromStream(new MemoryStream(bytes)); FrameDimension dimension = new FrameDimension(image.FrameDimensionsList[0]); for (int i = 0; i < image.GetFrameCount(dimension); i++) { image.SelectActiveFrame(dimension, i); pagine.Add(image.Clone() as Image); } //string tmp = Path.ChangeExtension(Path.GetTempFileName(),".pdf"); //File.WriteAllBytes(tmp, bytes); //Process.Start(tmp); //--- stampa sulla stampante PrintDocument printDoc = new PrintDocument(); printDoc.PrinterSettings.PrinterName = "#MIASTAMPANTE#"; printDoc.DocumentName = "#MIOREPORT#"; printDoc.PrintPage += new PrintPageEventHandler(printDoc_PrintPage); printDoc.Print(); } void printDoc_PrintPage(object sender, PrintPageEventArgs e) { //--- generazione di ogni pagina if (pagine.Count > pagina) e.Graphics.DrawImage(pagine[pagina], 0, 0); pagina++; e.HasMorePages = pagina < pagine.Count; }

ovviaemnte devi specificare il nome della stampante etc...

qualche esempio lo puoi trovare in rete, ti do' un paio di link utili:
www.gotreportviewer.com
http://msdn.microsoft.com/en-us/library/ms252091(VS.80).aspx


ciao.

Matteo Raumer
[MCAD .net]
http://blogs.dotnethell.it/freeteo

antoniogu83 Profilo | Newbie

Grazie Mille.

A dire il vero, discutendone con gli altri, si è pensato di inserire un banale pulsante "Cambia Stato", con la raccomandazione per l'utente di eseguire la procedura: la stampa è andata a buon fine? > "Cambio Stato".

Per le attuali esigenze penso che sia sufficiente, ma grazie alla risposta ho una nuova strada percorribile.

Spero comunque che nella prossima versione, report viewer consenta di controllare anche gli eventi di esportazione e stampa dei report.
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