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

WinForm RDLC SubReport Step by step的更多相关文章

  1. WPF Step By Step 控件介绍

    WPF Step By Step 控件介绍 回顾 上一篇,我们主要讨论了WPF的几个重点的基本知识的介绍,本篇,我们将会简单的介绍几个基本控件的简单用法,本文会举几个项目中的具体的例子,结合这些 例子 ...

  2. WPF Step By Step 系列 - 开篇 ·

    WPF Step By Step 系列 - 开篇 公司最近要去我去整理出一个完整的WPF培训的教程,我刚好将自己学习WPF的过程和经验总结整理成笔记的方式来讲述,这里就不按照书上面的东西来说了,书本上 ...

  3. Step by step Dynamics CRM 2011升级到Dynamics CRM 2013

    原创地址:http://www.cnblogs.com/jfzhu/p/4018153.html 转载请注明出处 (一)检查Customizations 从2011升级到2013有一些legacy f ...

  4. Step by Step 创建一个新的Dynamics CRM Organization

    原创地址:http://www.cnblogs.com/jfzhu/p/4012833.html 转载请注明出处 前面演示过如何安装Dynamics CRM 2013,参见<Step by st ...

  5. Step by step Install a Local Report Server and Remote Report Server Database

    原创地址:http://www.cnblogs.com/jfzhu/p/4012097.html 转载请注明出处 前面的文章<Step by step SQL Server 2012的安装 &g ...

  6. Step by step Dynamics CRM 2013安装

    原创地址:http://www.cnblogs.com/jfzhu/p/4008391.html 转载请注明出处   SQL Server可以与CRM装在同一台计算机上,也可安装在不同的计算机上.演示 ...

  7. Step by step 活动目录中添加一个子域

    原创地址:http://www.cnblogs.com/jfzhu/p/4006545.html 转载请注明出处 前面介绍过如何创建一个域,下面再介绍一下如何在该父域中添加一个子域. 活动目录中的森林 ...

  8. SQL Server 维护计划实现数据库备份(Step by Step)(转)

    SQL Server 维护计划实现数据库备份(Step by Step) 一.前言 SQL Server 备份和还原全攻略,里面包括了通过SSMS操作还原各种备份文件的图形指导,SQL Server  ...

  9. 转:eclipse以及step into step over step return的区别

    首先来讲一下step into step over step return的区别: step into就是单步执行,遇到子函数就进入并且继续单步执行:(F5) step over是在单步执行时,在函数 ...

随机推荐

  1. ORACLE数据库常用查询二

    ORACLE数据库常用查询 1.查看表空间对应数据文件情况: SQL MB,AUTOEXTENSIBLE FROM DBA_DATA_FILES; TABLESPACE_NAME FILE_NAME ...

  2. [core java学习笔记][第四章对象与类]

    4.3 用户自定义类 4.3.1 类数组的声明 需要两次new Employee[]=staff=new Employedd[3]; staff[0]=new Employedd(参数列表); sta ...

  3. Eclipse安装Vim——viPlugin插件

    1.下载viPlugin: http://www.viplugin.com/files/viPlugin_2.14.0.zip 2.安装 解压后有两个文件夹: features 和 plugins 把 ...

  4. EffectiveC#3--选择is或者as操作符而不是做强制类型转换

    1.用as运算符进行类型转换.因为比起盲目的强制转换它更安全,而且在运行时效率更高. 安全体现在:as操作符就算是转化一个null的引用时,也会安全的返回一个null而不会像强制转换抛出异常. 2.a ...

  5. css学习之color: window和color: currentColor

    一.易被忽略的属性 color: currentColor color: window   看完之后感觉眼前一亮,有的我之前根本没有用过,甚至都不知道有color: currentColor这么个东西 ...

  6. baidu地图的一个拾取坐标系统

    http://api.map.baidu.com/lbsapi/getpoint/index.html 可以很方便的通过标记取得经纬度坐标 也可以输入经纬度坐标获得地图标记

  7. 转帖:深入理解JavaScript系列

    感觉汤姆大叔这个系列写的很是不错,很适合有js基础但是想深入又无从下手的朋友. 深入理解JavaScript系列

  8. CDZSC_2015寒假新人(1)——基础 h

    Description Ignatius was born in a leap year, so he want to know when he could hold his birthday par ...

  9. ElasticSearch入门知识扫盲

    ElasticSearch 入门介绍 tags: 第三方 lucene [toc] 1. what Elastic Search(ES)是什么 全文检索和lucene 全文检索 优点:高效,准确,分词 ...

  10. [C++程序设计]内置函数

    注意: 可以在声明函数和定义函数时同时写 inline,也可以只在其中一处声明inline,效果相同,都能按内置函数处理. 使用内置函数可以节省运行时间,但却增加了目标 程序的长度.因此一般只将规模很 ...