最近在做的一個(gè)PO管理系統(tǒng),因?yàn)橐玫接唵未蛴?沒有用水晶報(bào)表,直接使用VS2010的Reporting.參考了網(wǎng)上的一些文章,但因?yàn)檎业降臄?shù)據(jù)是用于WebForm的,適配到WinForm有點(diǎn)區(qū)別,竟然花了很久才搞通.所以現(xiàn)在做個(gè)Step By Step以記錄.
參考Jimmy.Yang的博文:
http://m.survivalescaperooms.com/yjmyzz/archive/2011/09/19/2180940.html
開發(fā)環(huán)境: VS2010 C#
第一步,新建項(xiàng)目

2.在項(xiàng)目中新建數(shù)據(jù)集
3.在數(shù)據(jù)集DataSet按圖標(biāo)新建表T_DEPT,T_EMP.

4.在項(xiàng)目中新建報(bào)表rptDEPT
5.在報(bào)表rptDEPT.rdlc中新增一個(gè)Tablix表,選擇顯示DEPTNO,DEPTNAME.

6. 在Form1里新建一個(gè)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", "技術(shù)部"); dt.Rows.Add("03", "銷售部"); dt.Rows.Add("04", "客服部"); return dt; } }}
然后運(yùn)行結(jié)果顯示如下:

以上完成了一個(gè)單報(bào)表的制作,下面演示子報(bào)表的添加.
7.在項(xiàng)目中新建一個(gè)rptEMP.rdlc.

在子報(bào)表中增加表和字段

在父報(bào)表中添加子報(bào)表控件

在子報(bào)表控件上點(diǎn)擊右鍵,選擇屬性,將rptEMP設(shè)置為子報(bào)表.


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 WinFormSubReport213 {14 public partial class Form1 : Form15 {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 //定義子報(bào)表處理方法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", "技術(shù)部");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", "風(fēng)清揚(yáng)", "02");56 dt.Rows.Add("004", "郭靖", "03");57 dt.Rows.Add("005", "趙敏", "04");58 return dt;59 }60 }61 }
此時(shí)運(yùn)行程序,父報(bào)表和子報(bào)表都顯示完整的數(shù)據(jù).

8.在父報(bào)表中增加一個(gè)參數(shù)DeptNo.

選中父報(bào)表的tablix,在屬性欄的Filter項(xiàng)里添加過濾參數(shù)

在Form1.cs代碼里動(dòng)態(tài)增加一個(gè)參數(shù).

在子報(bào)表控件中增加一個(gè)[DeptNo]=[@DeptNo],作為子報(bào)表的參數(shù)

在子報(bào)表設(shè)計(jì)窗口增加報(bào)表.

最終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 //指定父報(bào)表文件 46 47 this.reportViewer1.LocalReport.ReportPath = @"../../rptDEPT.rdlc"; 48 49 //給父報(bào)表傳參數(shù) 50 51 this.reportViewer1.LocalReport.SetParameters(new ReportParameter("DeptNo", "02")); 52 53 //給父報(bào)表傳數(shù)據(jù) 54 55 this.reportViewer1.LocalReport.DataSources.Add(new ReportDataSource("DataSetDEPT",GetDeptData())); 56 57 58 59 //定義子報(bào)表處理方法 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", "技術(shù)部"); 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", "風(fēng)清揚(yáng)", "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 }
運(yùn)行結(jié)果如下:

再次感謝Jimmy.Yang的分享,此篇博文完全仿照他的博客,只是轉(zhuǎn)移到了WinForm,因?yàn)樽约涸谟玫臅r(shí)候走了一些彎路,希望記下來幫助記憶。
新聞熱點(diǎn)
疑難解答
圖片精選