最近在做的一個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設定為子報表.
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.LocalReport.SubreportProcessing += new SubreportProcessingEventHandler(LocalReport_SubreportProcessing); this.reportViewer1.RefreshReport();
}
private void LocalReport_SubreportProcessing(object sender, SubreportProcessingEventArgs e)
{
e.DataSources.Add(new ReportDataSource("DataSetEMP", GetEmpData()));
}
private DataTable GetDeptData()
{
DataTable dt = new DataTable();
dt.Columns.Add("DEPTNO", typeof(string));
dt.Columns.Add("DEPTNAME", typeof(string));
dt.Rows.Add("", "辦公室");
dt.Rows.Add("", "技術部");
dt.Rows.Add("", "銷售部");
dt.Rows.Add("", "客服部"); return dt;
}
private DataTable GetEmpData()
{
DataTable dt = new DataTable();
dt.Columns.Add("EMPNO", typeof(string));
dt.Columns.Add("EMPNAME", typeof(string));
dt.Columns.Add("DEPTNO", typeof(string));
dt.Rows.Add("", "楊過", "");
dt.Rows.Add("", "令狐沖", "");
dt.Rows.Add("", "風清揚", "");
dt.Rows.Add("", "郭靖", "");
dt.Rows.Add("", "趙敏", "");
return dt;
}
}
}
此時執行程式,父報表和子報表都顯示完整的資料.
8.在父報表中增加一個引數DeptNo.
選中父報表的tablix,在屬性欄的Filter項裡新增過濾引數
在Form1.cs程式碼裡動態增加一個引數.
在子報表控制元件中增加一個[DeptNo]=[@DeptNo],作為子報表的引數
在子報表設計視窗增加報表.
最終Form1.cs程式碼:
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.SetParameters(new ReportParameter("DeptNo", "")); //給父報表傳資料 this.reportViewer1.LocalReport.DataSources.Add(new ReportDataSource("DataSetDEPT",GetDeptData())); //定義子報表處理方法 this.reportViewer1.LocalReport.SubreportProcessing += new SubreportProcessingEventHandler(LocalReport_SubreportProcessing); this.reportViewer1.RefreshReport(); } private void LocalReport_SubreportProcessing(object sender, SubreportProcessingEventArgs e) { e.DataSources.Add(new ReportDataSource("DataSetEMP", GetEmpData())); } private DataTable GetDeptData() { DataTable dt = new DataTable(); dt.Columns.Add("DEPTNO", typeof(string)); dt.Columns.Add("DEPTNAME", typeof(string)); dt.Rows.Add("", "辦公室"); dt.Rows.Add("", "技術部"); dt.Rows.Add("", "銷售部"); dt.Rows.Add("", "客服部"); return dt; } private DataTable GetEmpData() { DataTable dt = new DataTable(); dt.Columns.Add("EMPNO", typeof(string)); dt.Columns.Add("EMPNAME", typeof(string)); dt.Columns.Add("DEPTNO", typeof(string)); dt.Rows.Add("", "楊過", ""); dt.Rows.Add("", "令狐沖", ""); dt.Rows.Add("", "風清揚", ""); dt.Rows.Add("", "郭靖", ""); dt.Rows.Add("", "趙敏", ""); return dt; } } }
執行結果如下:
再次感謝Jimmy.Yang的分享,此篇博文完全仿照他的部落格,只是轉移到了WinForm,因為自己在用的時候走了一些彎路,希望記下來幫助記憶。