I'm doing mvc reporting and i'm very new at it. I'm trying to create a report, and i have done it using rdlc. Everything works well, it can be exported to various format. My problem, when using rdlc is that we need to design and bind it first. How can i create an empty rdlc template, design and bind it with dataset programmatically.
My work so far (using empty rdlc template - just created the file without any table),
Controller File,
public ActionResult Report(string id)
{
DB.Open();
LocalReport lr1 = new LocalReport();
string path1 = Path.Combine(Server.MapPath("~/Report"), "TestEmptyReport.rdlc");
lr1.ReportPath = path1;
DataTable pc2a = new DataTable();
pc2a = DB.getDataSet().Tables[0];
pc2a.Columns.Add("Product Name");
pc2a.Columns.Add("Price");
pc2a.Columns.Add("Quantity");
ReportDataSource rdc = new ReportDataSource("DataSet1", pc2a);
lr1.DataSources.Add(rdc);
string reportType = id;
string mimeType;
string encoding;
string fileNameExtension;
string deviceInfo =
"<DeviceInfo>" +
"<OutputFormat>" + id + "</OutputFormat>" +
"<PageWidth>8.5in</PageWidth>" +
"<PageHeight>11in</PageHeight>" +
"<MarginTop>0.5in</MarginTop>" +
"<MarginLeft>1in</MarginLeft>" +
"<MarginRight>1in</MarginRight>" +
"<MarginBottom>0.5in</MarginBottom>" +
"</DeviceInfo>";
Warning[] warnings;
string[] streams;
byte[] renderedBytes;
renderedBytes = lr1.Render(
reportType,
deviceInfo,
out mimeType,
out encoding,
out fileNameExtension,
out streams,
out warnings);
return File(renderedBytes, mimeType);
}
Model File,
public DataSet getDataSet()
{
string query = "SELECT * FROM tblproduct";
if (con.State.ToString() == "Open")
{
SqlDataAdapter ad = new SqlDataAdapter(query, con);
DataSet ds = new DataSet("tblproduct");
ad.Fill(ds);
return ds;
}
else
{
return null;
}
}
View File,
<div style="padding: 10px; border: 1px solid black">
<div><a href="@Url.Action("Report", new { id = "PDF" })">Get PDF Report</a></div>
<div><a href="@Url.Action("Report", new { id = "Excel" })">Get Excel Report</a></div>
<div><a href="@Url.Action("Report", new { id = "Word" })">Get Word Report</a></div>
<div><a href="@Url.Action("Report", new { id = "Image" })">Get Image Report</a></div>
The data is there, but i just dont know how to connect it with rdlc. Means creating column based on the data and fill it with the data called from sql server.
TQVM in advanced. Explanation and example or any other method will be helpful.
If I understand your question correctly you wanted to create a report from a blank RDLC. You have to tell a RDLC file about the data in the design time. You can customize the report in the design time by adding columns or columns from another table or make a join.
Whereas Dynamic RDLC Generator through C# would be there to generate the report dynamically from RDLC. Since the complete ReportingEngine has been custom made but very generic. Copy paste might be going to help generating the report.
Your question implies that you need to generate RDLC report on runtime mode. Things you should remember to:
RDLC report viewer uses Microsoft.ReportViewer.WebForms
and Microsoft.Reporting.WebForms
namespaces, which utilizing WebForms logic code to bind and render the report. You can use a partial view which acts as container for ASPX page (either using single page or page with code behind) to render the report in MVC view pages.
NB: You can use ReportViewer
instance in controller action method to render RDLC as PDF file and returning FileContentResult
(see here).
RDLC contains XML tags which can be generated from various XML builder classes (see MSDN Report Definition for details).
Hence, you may create ReportViewer instance first, e.g.:
using Microsoft.Reporting.WebForms;
protected void Form_Load(Object sender, EventArgs e)
{
if (!IsPostBack)
{
ReportViewer1.ProcessingMode = ProcessingMode.Local;
ReportViewer1.LocalReport.ReportPath = Server.MapPath("~/Report.rdlc");
// add your DataSet here
var data = new DataTable(); // example data source
var dataSource = new ReportDataSource(DataSetName, data);
ReportViewer1.LocalReport.DataSources.Add(dataSource);
// put rendering stuff here
}
}
Then, use steps from Generating RDLC Dynamically for the Report Viewer Local Report example (WebForms is similar to WinForms in terms of event handling usage, thus may be applicable in ASPX page) to create corresponding XML tags which generates report structure, summarized as below.
DataSet
for usage in DataSources
element.Tablix
and TablixCorner
elements according to table structure inside DataSet
.TablixColumn
, TablixRow
and TablixCell
elements which includes Textbox
control depending to each column data types. The Value
element inside Textbox
control should contain expression =Fields!(ColumnName).Value
for database-bound columns.LoadReportDefinition
into ASPX page after all report elements generated properly.Alternatively, if you already know entire RDLC element structure, the similar solution using XmlWriter
class can generate required elements for building the report from scratch, then rename generated XML to RDLC extension and bind it for ReportViewer
control (seems takes some time to build each RDLC elements).
Additional references:
Rendering an RDLC report in HTML in ASP.NET MVC
Dynamic Reports with Reporting Services
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With