最近在做的一个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设置为子报表.
1 using System; 2 using System.Collections.Generic; 3 using System.ComponentModel; 4 using System.Data; 5 using System.Drawing; 6 using System.Linq; 7 using System.Text; 8 using System.Windows.Forms; 9 10 using Microsoft.Reporting.WinForms; 11 12 namespace WinFormSubReport2 13 { 14 public partial class Form1 : Form 15 { 16 public Form1() 17 { 18 InitializeComponent(); 19 } 20 21 private void Form1_Load(object sender, EventArgs e) 22 { 23 this.reportViewer1.LocalReport.ReportPath = @"..\..\rptDEPT.rdlc"; 24 this.reportViewer1.LocalReport.DataSources.Add(new ReportDataSource("DataSetDEPT",GetDeptData())); 25 26 //定義子報表處理方法 27 this.reportViewer1.LocalReport.SubreportProcessing += new SubreportProcessingEventHandler(LocalReport_SubreportProcessing); 28 29 this.reportViewer1.RefreshReport(); 30 } 31 private void LocalReport_SubreportProcessing(object sender, SubreportProcessingEventArgs e) 32 { 33 e.DataSources.Add(new ReportDataSource("DataSetEMP", GetEmpData())); 34 } 35 private DataTable GetDeptData() 36 { 37 DataTable dt = new DataTable(); 38 dt.Columns.Add("DEPTNO", typeof(string)); 39 dt.Columns.Add("DEPTNAME", typeof(string)); 40 dt.Rows.Add("01", "辦公室"); 41 dt.Rows.Add("02", "技術部"); 42 dt.Rows.Add("03", "銷售部"); 43 dt.Rows.Add("04", "客服部"); 44 45 return dt; 46 } 47 private DataTable GetEmpData() 48 { 49 DataTable dt = new DataTable(); 50 dt.Columns.Add("EMPNO", typeof(string)); 51 dt.Columns.Add("EMPNAME", typeof(string)); 52 dt.Columns.Add("DEPTNO", typeof(string)); 53 dt.Rows.Add("001", "楊過", "01"); 54 dt.Rows.Add("002", "令狐沖", "02"); 55 dt.Rows.Add("003", "風清揚", "02"); 56 dt.Rows.Add("004", "郭靖", "03"); 57 dt.Rows.Add("005", "趙敏", "04"); 58 return dt; 59 } 60 } 61 }
此时运行程序,父报表和子报表都显示完整的数据.
8.在父报表中增加一个参数DeptNo.
选中父报表的tablix,在属性栏的Filter项里添加过滤参数
在Form1.cs代码里动态增加一个参数.
在子报表控件中增加一个[DeptNo]=[@DeptNo],作为子报表的参数
在子报表设计窗口增加报表.
最终Form1.cs代码:
1 using System; 2 3 using System.Collections.Generic; 4 5 using System.ComponentModel; 6 7 using System.Data; 8 9 using System.Drawing; 10 11 using System.Linq; 12 13 using System.Text; 14 15 using System.Windows.Forms; 16 17 18 19 using Microsoft.Reporting.WinForms; 20 21 22 23 namespace WinFormSubReport2 24 25 { 26 27 public partial class Form1 : Form 28 29 { 30 31 public Form1() 32 33 { 34 35 InitializeComponent(); 36 37 } 38 39 40 41 private void Form1_Load(object sender, EventArgs e) 42 43 { 44 45 //指定父报表文件 46 47 this.reportViewer1.LocalReport.ReportPath = @"..\..\rptDEPT.rdlc"; 48 49 //给父报表传参数 50 51 this.reportViewer1.LocalReport.SetParameters(new ReportParameter("DeptNo", "02")); 52 53 //给父报表传数据 54 55 this.reportViewer1.LocalReport.DataSources.Add(new ReportDataSource("DataSetDEPT",GetDeptData())); 56 57 58 59 //定义子报表处理方法 60 61 this.reportViewer1.LocalReport.SubreportProcessing += new SubreportProcessingEventHandler(LocalReport_SubreportProcessing); 62 63 64 65 this.reportViewer1.RefreshReport(); 66 67 } 68 69 private void LocalReport_SubreportProcessing(object sender, SubreportProcessingEventArgs e) 70 71 { 72 73 e.DataSources.Add(new ReportDataSource("DataSetEMP", GetEmpData())); 74 75 } 76 77 private DataTable GetDeptData() 78 79 { 80 81 DataTable dt = new DataTable(); 82 83 dt.Columns.Add("DEPTNO", typeof(string)); 84 85 dt.Columns.Add("DEPTNAME", typeof(string)); 86 87 dt.Rows.Add("01", "办公室"); 88 89 dt.Rows.Add("02", "技术部"); 90 91 dt.Rows.Add("03", "销售部"); 92 93 dt.Rows.Add("04", "客服部"); 94 95 96 97 return dt; 98 99 } 100 101 private DataTable GetEmpData() 102 103 { 104 105 DataTable dt = new DataTable(); 106 107 dt.Columns.Add("EMPNO", typeof(string)); 108 109 dt.Columns.Add("EMPNAME", typeof(string)); 110 111 dt.Columns.Add("DEPTNO", typeof(string)); 112 113 dt.Rows.Add("001", "杨过", "01"); 114 115 dt.Rows.Add("002", "令狐冲", "02"); 116 117 dt.Rows.Add("003", "风清扬", "02"); 118 119 dt.Rows.Add("004", "郭靖", "03"); 120 121 dt.Rows.Add("005", "赵敏", "04"); 122 123 return dt; 124 125 } 126 127 } 128 129 }
运行结果如下:
再次感謝Jimmy.Yang的分享,此篇博文完全仿照他的博客,只是轉移到了WinForm,因為自己在用的時候走了一些彎路,希望記下來幫助記憶。