• WinForm RDLC SubReport Step by step


    最近在做的一个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 = @"....
    ptDEPT.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 = @"....
    ptDEPT.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 }
    View Code

    此时运行程序,父报表和子报表都显示完整的数据.

     

     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 = @"....
    ptDEPT.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 }
    View Code

    运行结果如下:

     

     再次感謝Jimmy.Yang的分享,此篇博文完全仿照他的博客,只是轉移到了WinForm,因為自己在用的時候走了一些彎路,希望記下來幫助記憶。

  • 相关阅读:
    领料单取整
    财务应付金额对不上的
    销售订单计算交期
    辅助单位启用
    K3CLOUD日志目录
    QLIKVIEW-日期格式,数字格式写法
    MRP运算报错-清除预留
    整单折扣后 财务、暂估应付价税合计对不上的问题处理
    BZOJ 2976: [Poi2002]出圈游戏 Excrt+set
    BZOJ 3060: [Poi2012]Tour de Byteotia 并查集
  • 原文地址:https://www.cnblogs.com/keepee/p/4286928.html
Copyright © 2020-2023  润新知