Objective: To create PDF file(or any type supported by RDLC) from an ASP.Net(any .net) application from a in-memory dataset.
First, lets create an ASP.Net application using the new Project creation wizard.
Add a new project item and chose Report(report1.rdlc)
What we need now is a dataset, which we can use in reports. To do this, lets add a new item – dataset.
lets name it as MyDataset.XSD. Lets open this dataset and add a table using the toolbox. Lets name it as DataTable1 and lets add two columns here Email and User. Lets compile this once so that we generate the dataset model.
Next step is to use this in our reports. Lets open the report designer(double click the RDLC added earlier) and add a DataSet to this. On report data panel, say New->Data Set.
Now select the Mydataset as the data source and the default table as dataset. Now we have Email and User as columns. Lets leave the name as DataSet1. Now its ready to be used in the report.
If everything goes right, you can add a tablix and associate the DataSet1 with it. Now you should see the fields available for using in reports.
I have mapped user and Email fields in the report.
Now lets focus back to our code. Open the markup and drop a report viewer control. This should look something like this.
<rsweb:ReportViewer ID="repViewer" runat="server">
</rsweb:ReportViewer>
Lets prepare the data to fill the report data using the C# code. We can do this in two ways.
- Use the same dataset(MyDataSet)
- Create a new dataset on the fly.
Lets try the second approach. On the code behind, lets create a data set and add a table to it and add some data.
DataSet ds = new DataSet();
DataTable dt = new DataTable();
dt.Columns.Add("User");
dt.Columns.Add("Email");
dt.Rows.Add("Guru", "Guru@aa.com");
dt.Rows.Add("Guru", "Guru@aa.com");
dt.Rows.Add("Guru", "Guru@aa.com");
dt.Rows.Add("Guru", "Guru@aa.com");
ds.Tables.Add(dt);
Now, lets bind this to the report.
repViewer.Reset(); // follow the same order, reset and then add the data repViewer.LocalReport.ReportPath = "Report1.rdlc";
reportDataSource rs = new ReportDataSource();
rs.Name = "DataSet1"; // Important: Use the same name as given in the report.
rs.Value = ds.Tables[0];
repViewer.LocalReport.DataSources.Add(rs);
Finally, rendering part. Lets return the response as a PDF file
string mimeType;
string encoding;
string extension;
Warning[] warnings;
string[] streamids;
byte[] reportBytes = repViewer.LocalReport.Render("PDF", null,
out mimeType, out encoding,
out extension, out streamids,
out warnings);
Response.ClearContent(); Response.ClearHeaders();
Response.AddHeader("Content-Disposition", "inline; filename=Test.pdf");
/ Response.AddHeader("Accept-Header", reportBytes.Length.ToString());
Response.ContentType = "application/pdf";
Response.OutputStream.Write(reportBytes, 0, reportBytes.Length);
Response.Flush();
Response.Close();
Only advantage of creating the dataset using XSD(MyDataSet) is that you can use them in the report directly by selecting the element. This will help you a lot while binding. You can also connect to SQL and build your data set and use it for report design. Later you can build your own dataset like we have done and use it by providing the same name.Following SQL statement will do the job for you.
Select 'Guru' as User, select 'Test' as Email
Screen shot below is the output, Pdf displayed in browser embedded. This approach will be a great help if you have specify requirement for printing involving the layout, breaks and header/footer.
No comments:
Post a Comment