前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >WinForm RDLC SubReport Step by step

WinForm RDLC SubReport Step by step

作者头像
DotNet Whisperer
发布于 2024-08-14 07:14:42
发布于 2024-08-14 07:14:42
21400
代码可运行
举报
文章被收录于专栏:DotNet杂记DotNet杂记
运行总次数:0
代码可运行

最近在做的一个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.

并填上如下代码

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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设置为子报表.

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 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 = @"..\..\rptDEPT.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 }

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

 8.在父报表中增加一个参数DeptNo.

选中父报表的tablix,在属性栏的Filter项里添加过滤参数

在Form1.cs代码里动态增加一个参数.

在子报表控件中增加一个[DeptNo]=[@DeptNo],作为子报表的参数

在子报表设计窗口增加报表.

最终Form1.cs代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
  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 = @"..\..\rptDEPT.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 }

运行结果如下:

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

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2015-02-11,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
"RDLC"报表-参数传递及主从报表
今天继续学习RDLC报表的“参数传递”及“主从报表” 一、先创建DataSet,如下图: 二、创建一个报表rptDEPT.rdlc,显示部门T_DPET的数据 三、嵌入Default.aspx中,写在
菩提树下的杨过
2018/01/23
3.1K0
"RDLC"报表-参数传递及主从报表
ReportViewer不连接数据库,自定义DataSet导出到报表
最近在看报表这一块,在网上找到的大都是连接数据库的,对于自定义的DataTable数据没有详细的连接说明,经过一番寻找,总结一下大概方法,大神请直接无视
冰封一夏
2019/09/11
1.2K0
ReportViewer不连接数据库,自定义DataSet导出到报表
"RDLC报表"速成指南
RDLC报表是微软自家的报表,已经集成在vs2010中,相对水晶报表更轻量级,更重要的是:可直接在web项目中使用。 使用步骤: 一、创建DataSet 右击->Add New Item-> Data
菩提树下的杨过
2018/01/23
3.7K0
"RDLC报表"速成指南
rdlc
https://stackoverflow.com/questions/4652347/dynamically-binding-of-dataset-to-rdlc-reports
landv
2020/02/11
7350
RDLC(Reportview)报表直接打印,支持所有浏览器,客户可在linux下浏览使用
最近在做一个打印清单的,但是rdlc报表自带的工具栏中的打印按钮只有在ie内核下的浏览器才可以使用(其他的就会 隐藏),这导致了使用火狐和谷歌浏览器还有使用linux系统的客户打印成了问题,于是就自己百度搜,谷歌搜,然后就解决了,下面放上源码
冰封一夏
2019/09/11
2.2K0
动态生成RDLC报表
1、从DataGrid提取(包括最新的增删改)数据,自动生成对应的RDLC报表文件(以流的形式驻存在内存中),用ReportViewer类来展示、打印、排版、预览、分页
NaughtyCat
2020/10/09
8.6K0
动态生成RDLC报表
RDLC报表多条件分组
一个报表如果要先按A分组,然后再按B分组,再按C分组...这种多条件分组情况下,RDLC报表处理起来并不方便。 只能另辟蹊径,想些歪招了: 比如有一张员工表,里面有公司编码COMPANYCODE,部门号DEPTNO,员工号EMPNO,员工姓名EMPNAME 需要在报表上,先按公司分组,相同公司的再按部门分组 看看下面的处理代码 DataTable dt = new DataTable(); dt.Columns.Add("EMPNO", typeof(stri
菩提树下的杨过
2018/01/24
1.5K0
RDLC报表多条件分组
C#实例:datagridview单元格合并
这是替C#微信交流群群友做的一个小实例,目的就是在datagridview选择对应行以后,点击button后获取对应行的ip,并执行相应的操作,其实我觉得这样的话button没必要非放置到datagridview里面的!但是为了满足群友的需求,还是这么做了。
zls365
2020/08/19
5.2K0
C#实例:datagridview单元格合并
动态生成TreeView方法(一)
一般情况下生成TreeView我们用的是用递归不建议用递归数据量大了会慢, 小弟今天用SortedList集合实现一下没有技术含量,一看代码大家就会明白。个人也比较喜欢这种方法,数据量大了执行速度也可
lpxxn
2018/01/31
1.4K0
动态生成TreeView方法(一)
ChartControl控件绘制折线图
在GridControl控件中点击Run Designer,添加三列数据并分别设置FieldName(与数据库中对应)
别团等shy哥发育
2023/02/27
8780
ChartControl控件绘制折线图
【愚公系列】2023年11月 Winform控件专题 Chart控件详解
Winform控件是Windows Forms中的用户界面元素,它们可以用于创建Windows应用程序的各种视觉和交互组件,例如按钮、标签、文本框、下拉列表框、复选框、单选框、进度条等。开发人员可以使用Winform控件来构建用户界面并响应用户的操作行为,从而创建功能强大的桌面应用程序。
愚公搬代码
2023/11/30
3.4K0
C#代码示例:在WinForm中创建并绑定一个DataTable
在我的一篇文章中,我解释了如何在没有数据库的情况下以web形式绑定gridview。这里,我将解释如何在没有数据库的windows窗体中绑定datagrid。
程序你好
2018/07/23
4.1K0
C# excel文件导入导出
在C#交流群里,看到很多小伙伴在excel数据导入导出到C#界面上存在疑惑,所以今天专门做了这个主题,希望大家有所收获!
zls365
2020/08/19
3.9K0
C# excel文件导入导出
动态生成TreeView方法(二)
这次是用递归的方法实现 ,我想大家都知道怎么做吧,就不 多说了, 还是不建议用递归,数据量大了会映响速度,动态生成TreeView方法(一)是我比较喜欢的方法 看一下效果图 前台代码: <%@ Pag
lpxxn
2018/01/31
1.4K0
动态生成TreeView方法(二)
如何在CRM系统中集成ActiveReports最终报表设计器
有时候,将ActiveReports设计器集成到业务系统中,为用户提供一些自定义的数据表,用户不需要了解如何底层的逻辑关系和后台代码,只需要选择几张关联的数据表,我们会根据用户的选择生成可供用户直接使
葡萄城控件
2018/01/10
1.3K0
如何在CRM系统中集成ActiveReports最终报表设计器
List,DataTable实现行转列的通用方案
本文通过行转列引出System.Linq.Dynamic,并介绍了过滤功能,其实它的用处还有很多,等待大家发掘。
用户1168362
2018/01/05
2.1K0
List,DataTable实现行转列的通用方案
合并两个结构完全相同的DataTable
两个结构一模一样的DataTable如何合并? 例子:使用Winform进行演示,表2的数据为固定的,表1的数据可以动态添加,通过合并按钮合并表1和表2的数据到表3 1.规定公共的DataTable结
用户1055830
2018/01/18
2.1K0
合并两个结构完全相同的DataTable
【愚公系列】2023年11月 Winform控件专题 DataGridView控件详解
Winform控件是Windows Forms中的用户界面元素,它们可以用于创建Windows应用程序的各种视觉和交互组件,例如按钮、标签、文本框、下拉列表框、复选框、单选框、进度条等。开发人员可以使用Winform控件来构建用户界面并响应用户的操作行为,从而创建功能强大的桌面应用程序。
愚公搬代码
2023/11/30
2.7K0
.NET连接SAP系统专题:C#调用RFC代码(三)
    本文就说明在C#中如何编写代码来调用SAP中的RFC函数获取数据。(Winform32)
SAP梦心
2022/05/10
1.8K0
.NET连接SAP系统专题:C#调用RFC代码(三)
Linq 和DefaultView两种方法去掉DataTable 里的重复行
在做项目的时候经常会遇到DataTable 里的数据重复,或者合并两个DataTable后有数据重复 一般我们是想把重复的删除掉,还有其它的方式实现比如用Linq和DataTable的DefaultV
lpxxn
2018/01/31
1.6K0
Linq 和DefaultView两种方法去掉DataTable 里的重复行
推荐阅读
相关推荐
"RDLC"报表-参数传递及主从报表
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验