最近在做的一个PO管理系统,因为要用到订单打印,没有用水晶报表,直接使用VS2010的Reporting.参考了网上的一些文章,但因为找到的数据是用于WebForm的,适配到WinForm有点区别,竟然花了很久才搞通.所以现在做个Step By Step以记录.
参考Jimmy.Yang的博文:
http://www.cnblogs.com/yjmyzz/archive/2011/09/19/2180940.html
开发环境: VS2010 C#
第一步,新建项目
2.在项目中新建数据集
3.在数据集DataSet按图标新建表T_DEPT,T_EMP.
4.在项目中新建报表rptDEPT
5.在报表rptDEPT.rdlc中新增一个Tablix表,选择显示DEPTNO,DEPTNAME.
6. 在Form1里新建一个ReportViewer1.
并填上如下代码
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using Microsoft.Reporting.WinForms;
namespace WinFormSubReport2
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}PRivate void Form1_Load(object sender, EventArgs e)
{
this.reportViewer1.LocalReport.ReportPath = @"..\..\rptDEPT.rdlc";
this.reportViewer1.LocalReport.DataSources.Add(new ReportDataSource("DataSetDEPT",GetDeptData()));
this.reportViewer1.RefreshReport();
}
private DataTable GetDeptData()
{
DataTable dt = new DataTable();
dt.Columns.Add("DEPTNO", typeof(string));
dt.Columns.Add("DEPTNAME", typeof(string));
dt.Rows.Add("01", "办公室");
dt.Rows.Add("02", "技术部");
dt.Rows.Add("03", "销售部");
dt.Rows.Add("04", "客服部");
return dt;
}
}
}
然后运行结果显示如下:
以上完成了一个单报表的制作,下面演示子报表的添加.
7.在项目中新建一个rptEMP.rdlc.
在子报表中增加表和字段
在父报表中添加子报表控件
在子报表控件上点击右键,选择属性,将rptEMP设置为子报表.
1usingSystem;2usingSystem.Collections.Generic;3usingSystem.ComponentModel;4usingSystem.Data;5usingSystem.Drawing;6usingSystem.Linq;7usingSystem.Text;8usingSystem.Windows.Forms;910usingMicrosoft.Reporting.WinForms;1112namespaceWinFormSubReport213{14publicpartialclassForm1 : Form15{16publicForm1()17{18InitializeComponent();19}2021privatevoidForm1_Load(objectsender, EventArgs e)22{23this.reportViewer1.LocalReport.ReportPath =@"..\..\rptDEPT.rdlc";24this.reportViewer1.LocalReport.DataSources.Add(newReportDataSource("DataSetDEPT",GetDeptData()));2526//定義子報表處理方法27this.reportViewer1.LocalReport.SubreportProcessing +=newSubreportProcessingEventHandler(LocalReport_SubreportProcessing);2829this.reportViewer1.RefreshReport();30}31privatevoidLocalReport_SubreportProcessing(objectsender, SubreportProcessingEventArgs e)32{33e.DataSources.Add(newReportDataSource("DataSetEMP", GetEmpData()));34}35privateDataTable GetDeptData()36{37DataTable dt =newDataTable();38dt.Columns.Add("DEPTNO",typeof(string));39dt.Columns.Add("DEPTNAME",typeof(string));40dt.Rows.Add("01","辦公室");41dt.Rows.Add("02","技術部");42dt.Rows.Add("03","銷售部");43dt.Rows.Add("04","客服部");4445returndt;46}47privateDataTable GetEmpData()48{49DataTable dt =newDataTable();50dt.Columns.Add("EMPNO",typeof(string));51dt.Columns.Add("EMPNAME",typeof(string));52dt.Columns.Add("DEPTNO",typeof(string));53dt.Rows.Add("001","楊過","01");54dt.Rows.Add("002","令狐沖","02");55dt.Rows.Add("003","風清揚","02");56dt.Rows.Add("004","郭靖","03");57dt.Rows.Add("005","趙敏","04");58returndt;59}60}61}
View Code
此时运行程序,父报表和子报表都显示完整的数据.
8.在父报表中增加一个参数DeptNo.
选中父报表的tablix,在属性栏的Filter项里添加过滤参数
在Form1.cs代码里动态增加一个参数.
在子报表控件中增加一个[DeptNo]=[@DeptNo],作为子报表的参数
在子报表设计窗口增加报表.
最终Form1.cs代码:
1usingSystem;23usingSystem.Collections.Generic;45usingSystem.ComponentModel;67usingSystem.Data;89usingSystem.Drawing;1011usingSystem.Linq;1213usingSystem.Text;1415usingSystem.Windows.Forms;16171819usingMicrosoft.Reporting.WinForms;20212223namespaceWinFormSubReport22425{2627publicpartialclassForm1 : Form2829{3031publicForm1()3233{3435InitializeComponent();3637}38394041privatevoidForm1_Load(objectsender, EventArgs e)4243{4445//指定父报表文件4647this.reportViewer1.LocalReport.ReportPath =@"..\..\rptDEPT.rdlc";4849//给父报表传参数5051this.reportViewer1.LocalReport.SetParameters(newReportParameter("DeptNo","02"));5253//给父报表传数据5455this.reportViewer1.LocalReport.DataSources.Add(newReportDataSource("DataSetDEPT",GetDeptData()));56575859//定义子报表处理方法6061this.reportViewer1.LocalReport.SubreportProcessing +=newSubreportProcessingEventHandler(LocalReport_SubreportProcessing);62636465this.reportViewer1.RefreshReport();6667}6869privatevoidLocalReport_SubreportProcessing(objectsender, SubreportProcessingEventArgs e)7071{7273e.DataSources.Add(newReportDataSource("DataSetEMP", GetEmpData()));7475}7677privateDataTable GetDeptData()7879{8081DataTable dt =newDataTable();8283dt.Columns.Add("DEPTNO",typeof(string));8485dt.Columns.Add("DEPTNAME",typeof(string));8687dt.Rows.Add("01","办公室");8889dt.Rows.Add("02","技术部");9091dt.Rows.Add("03","销售部");9293dt.Rows.Add("04","客服部");94959697returndt;9899}100101privateDataTable GetEmpData()102103{104105DataTable dt =newDataTable();106107dt.Columns.Add("EMPNO",typeof(string));108109dt.Columns.Add("EMPNAME",typeof(string));110111dt.Columns.Add("DEPTNO",typeof(string));112113dt.Rows.Add("001","杨过","01");114115dt.Rows.Add("002","令狐冲","02");116117dt.Rows.Add("003","风清扬","02");118119dt.Rows.Add("004","郭靖","03");120121dt.Rows.Add("005","赵敏","04");122123returndt;124125}126127}128129}
View Code
运行结果如下:
再次感謝Jimmy.Yang的分享,此篇博文完全仿照他的博客,只是轉移到了WinForm,因為自己在用的時候走了一些彎路,希望記下來幫助記憶。