最近在做的一個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,因為自己在用的時候走了一些彎路,希望記下來幫助記憶。