在朋友的邀请下,朋友公司是做高端智能会议系统的给他们公司开发一个简单的公司门户网站。本人都多年没有写ASP.NET C#代码了。这几年都在做数据库和商务智能这块。反正朋友说网站不难,就个简单的展现网站,于是就答应了,找了一天到他们公司去听具体的开发需求,听了需求后,觉得难道不是很大,主要的难点在一个在线租赁平台。朋友的公司是做检测设备租赁的。于是就答应了。承诺在1个月内做好。主要是周末和晚上做。
所有的框架和页面展示功能都还可以,很快就开发好了。但是当在开发打印报表的时候,遇到了就障碍,主要是自己以前做的大多是C/S的开发。B/S的做的不多,更没有开发个B/S报表,而且该报表的数据源是动态的。
于是只能找度娘了,找了好多都没有满足我的要求的,大部分都是简单的直接的从数据库表里拉一个静态表做为数据源。要不就是草草的写点步骤,步骤还不是完整的,误导特大。说误导是我自己按照他们的说法做,调试都不成功,那个心情是想骂娘啊。天不负苦心人。终于搞定了。于是下定决心来写一个完整的步骤。希望能给找这方面需求的朋友能直接按照我的步骤一步一步做下去就可以实现结果。
ReportViewer连接静态的数据表就不说了,下面来写下如何实现让ReportViewer绑定动态的数据源:
一,创建一个Web窗体,命名为WebPrintOrder。 在工具箱里拉一个MicrosoftReportViewer控件到该Web窗体里
1,把MicrosoftReportViewer拉到页面自动生成如下页面代码:
2,查看页面设计就会显示一个报表控件如下:
二,为报表设置数据源
1,添加RDLC报表控件,名称report.rdlc
2,返回到WebPrintOrder设计界面,点击报表的右上角的>,选择我刚才添加的Report.rdlc如下图:
3,双击选择report.rdlc,这个时候显示的是report.rdlc的设计页面,点击【添加新数据源】,这时候就会显示如下的样式,左边多了一个DataSet1,右侧在App_Code的目录下面多了一个DataSet1.xsd的文件。
4,双击DataSet1.xsd文件,并且在该页面上【右键】添加DataTable显示如下图:
5,我创建了一个名称为PrintOrder的表,然后添加具体的表字段如下图:
6,由于我的报表里需要两个数据源,于是我再次添加数据源如下图:
7,当我点击【添加新数据源】的时候,系统自动又帮我创建了一个DataSet2.xsd 的文件在App_Code下面,如下图:
8,再次双击DataSet2.xsd, 添加新的表如下图:
9,添加一个表名称为RentInfo的表如下:
10,回到report.rdlc设计界面就可以看到两个数据源了,分别叫DataSet1 和 DataSet2
三,开始设计报表
1, 在report.rdlc设计页面,把文本框,折线图和表拖到报表页面上
2,表里的数据直接从网站数据源里把相应的表字段拉到表的明细里就可以了。如下图:
3,这里需要重点介绍的是如何在报表里添加参数,选择【报表】----》【报表参数】 如下图:
4, 我的参数设计如下:
5,上面是报表设计和数据源设计完成,下面来看代码如何和此报表关联起来。
四,报表数据源的绑定代码
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
if (!string.IsNullOrEmpty(Request.QueryString["ID"]))
{
strRentDateCode = Request.QueryString["ID"].ToString();
}
BindData();
BindPrintOrder();
string CompanyName=Session["Member"].ToString();
QueryParam queryparam = new QueryParam();
if (!string.IsNullOrEmpty(CompanyName))
queryparam.Add("CompanyName", QueryParam.RELATION.EQ, "'" + CompanyName + "'");
memberModel = member.GetMemberModel(CompanyName);
DataTable dtPrintOrder = GetPrintOrderData();
DataTable dtRentInfo = GetRentInfoData();
ReportViewer1.LocalReport.ReportPath = "Report.rdlc";
Microsoft.Reporting.WebForms.ReportDataSource rds = new Microsoft.Reporting.WebForms.ReportDataSource("DataSet1_PrintOrder", dtPrintOrder);
Microsoft.Reporting.WebForms.ReportDataSource rds2 = new Microsoft.Reporting.WebForms.ReportDataSource("DataSet2_RentInfo", dtRentInfo);
//ReportParameter rptParaA = new ReportParameter("rptParaA", "申请日期");
//ReportViewer1.LocalReport.SetParameters(new ReportParameter[] { rptParaA });
//ReportParameter rptParaB = new ReportParameter("rptParaB", "公司名称");
//ReportViewer1.LocalReport.SetParameters(new ReportParameter[] { rptParaB });
ReportViewer1.LocalReport.DataSources.Clear();
List para = new List();
//这里是添加两个字段
para.Add(new ReportParameter("RentDate", strRentDateCode));
para.Add(new ReportParameter("CompanyName", memberModel.CompanyName));
para.Add(new ReportParameter("Address", memberModel.Address));
para.Add(new ReportParameter("Person", memberModel.Person));
para.Add(new ReportParameter("Phone", memberModel.Phone));
para.Add(new ReportParameter("Email", memberModel.Email));
para.Add(new ReportParameter("Count", dtPrintOrder.Rows.Count.ToString()));
this.ReportViewer1.LocalReport.SetParameters(para);
ReportViewer1.LocalReport.DataSources.Add(rds);
ReportViewer1.LocalReport.DataSources.Add(rds2);
this.ReportViewer1.ZoomMode = Microsoft.Reporting.WebForms.ZoomMode.Percent;
this.ReportViewer1.ZoomPercent = 100;
ReportViewer1.LocalReport.Refresh();
}
}
五, 运行程序查看报表如下:
导出成PDF如下:
六,至此ASP.NET C# 动态ReportViewer开发完成。如果您能一直看到这里,我相信您肯定能开发出此类报表。希望此文章能给您帮助。欢迎互相学习!我也是B/S报表开发的二把刀,呵呵!