posts - 315, comments - 268, trackbacks - 15

My Links

News

View Pietro Libro's profile on LinkedIn

DomusDotNet
   DomusDotNet

Pietro Libro

Tag Cloud

Article Categories

Archives

Post Categories

Blogs amici

Links

Image, MemoryStream e file .rdlc

Supponiamo di avere un file di Report in formato .rdlc, e di voler stampare una lista di prodotti visualizzando un'immagine prodotta a run-time e memorizzata in un MemoryStream, piuttosto che utilizzare file d'immagine. Ad esempio, supponiamo di avere nel nostro Database, una tabella denominata Prodotti, contenente 4 colonne:

image

Aggiungiamo al nostro progetto (ad esempio di tipo Web Application) un DataSet tipizzato (dsProdotti)  contenente un DataTable Prodotti, a cui andiamo ad aggiungere una colonna denominata  Immagine, con proprietà DataType impostata su System.Byte[]:

image

Aggiungiamo un nuovo file di Report (Report1.rdlc), nel designer del report, dalla toolbox degli strumenti, trasciniamo nella sezione Body, un item Table che configuriamo  opportunamente:

image

Come si evince dalla figura, nell'ultima colonna della Table, è stato aggiunto un controllo Image. Affinchè il tutto funzioni correttamente, è necessario impostare correttamente le proprietà di questo controllo, ovvero:

  1. La proprietà Source deve essere impostata su Database
  2. La proprietà MIMEType deve essere impostata sul tipo di immagine che si vuole visualizzare (images/gif, image/jpeg etc...)
  3. La proprietà Value deve essere impostata sul valore campo contenente lo Stream di byte, nello specifico: =Fields!Immagine.Value

Agganciato il report ad un opportuno controllo ReportViewer  non resta che scrivere il codice per recuperare i dati dal Database e popolare un opportuno DataTable, da utilizzare come sorgente dati per il Report:

1 DsProdotti dsProdotti = new DsProdotti(); 2 3 dsProdotti.Prodotti.RowChanged += new DataRowChangeEventHandler(Prodotti_RowChanged); 4 5 using (DsProdottiTableAdapters.ProdottiTableAdapter prodottiAdapter = new ReportConImmaginiStream.DsProdottiTableAdapters.ProdottiTableAdapter()) 6 { 7 prodottiAdapter.Fill(dsProdotti.Prodotti); 8 } 9 10 ReportViewer1.LocalReport.DataSources.Clear(); 11 ReportViewer1.LocalReport.DataSources.Add(new Microsoft.Reporting.WebForms.ReportDataSource("DsProdotti_Prodotti", dsProdotti.Prodotti));

 

Gestendo  l'evento RowChanged del DataTable Prodotti, possiamo popolare il valore del campo Immagine della riga aggiunta alla collezione del DataTable, con lo stream di byte rappresentante l'immagine che vogliamo visualizzare:

1 void Prodotti_RowChanged(object sender, DataRowChangeEventArgs e) 2 { 3 if (e.Action == DataRowAction.Add) 4 { 5 //Immagine da Stream 6 e.Row["Immagine"] = ImageDataRow.ImageDataRowIstance.GetImageArray(); 7 } 8 }

Dove il codice della classe ImageDataRow è il seguente:

1 public class ImageDataRow 2 { 3 private static byte[] _imageArray = null; 4 private static ImageDataRow _imageDataRowIstance; 5 6 private ImageDataRow() { } 7 8 public static ImageDataRow ImageDataRowIstance 9 { 10 get 11 { 12 if (_imageDataRowIstance == null) 13 _imageDataRowIstance = new ImageDataRow(); 14 return _imageDataRowIstance; 15 } 16 } 17 18 public System.Byte[] GetImageArray() 19 { 20 if (_imageArray == null) 21 { 22 using (MemoryStream imgStream = new MemoryStream()) 23 { 24 System.Drawing.Image img = new Bitmap(32, 32); 25 Graphics gr = Graphics.FromImage(img); 26 gr.FillRectangle(new SolidBrush(Color.White), 0, 0, 32, 32); 27 gr.DrawEllipse(new Pen(Color.Red, 2), 1, 1, 30, 30); 28 img.Save(imgStream, System.Drawing.Imaging.ImageFormat.Gif); 29 _imageArray = imgStream.ToArray(); 30 } 31 } 32 return _imageArray; 33 } 34 }

Dato che nell'esempio viene visualizzata sempre la stessa immagine, per non instanziare ad ogni riga un oggetto MemoryStream ed eseguire il codice di  disegno, si è scelto di utilizzare un Singleton. Ovviamente, nel caso in cui l'immagine debba cambiare a seconda dei valori contenuti nella riga, il codice dovrà essere ottimizzato opportunamente.

Il risultato che si otterrà eseguendo il codice, sarà qualcosa del tipo:

image

Sorgenti completi del progetto

Print | posted on martedì 25 novembre 2008 19:42 | Filed Under [ C# ASP.NET Reporting ]

Comments have been closed on this topic.

Powered by:
Powered By Subtext Powered By ASP.NET