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 = @"..\..\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的更多相关文章
- WPF Step By Step 控件介绍
WPF Step By Step 控件介绍 回顾 上一篇,我们主要讨论了WPF的几个重点的基本知识的介绍,本篇,我们将会简单的介绍几个基本控件的简单用法,本文会举几个项目中的具体的例子,结合这些 例子 ...
- WPF Step By Step 系列 - 开篇 ·
WPF Step By Step 系列 - 开篇 公司最近要去我去整理出一个完整的WPF培训的教程,我刚好将自己学习WPF的过程和经验总结整理成笔记的方式来讲述,这里就不按照书上面的东西来说了,书本上 ...
- Step by step Dynamics CRM 2011升级到Dynamics CRM 2013
原创地址:http://www.cnblogs.com/jfzhu/p/4018153.html 转载请注明出处 (一)检查Customizations 从2011升级到2013有一些legacy f ...
- Step by Step 创建一个新的Dynamics CRM Organization
原创地址:http://www.cnblogs.com/jfzhu/p/4012833.html 转载请注明出处 前面演示过如何安装Dynamics CRM 2013,参见<Step by st ...
- 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 ...
- Step by step Dynamics CRM 2013安装
原创地址:http://www.cnblogs.com/jfzhu/p/4008391.html 转载请注明出处 SQL Server可以与CRM装在同一台计算机上,也可安装在不同的计算机上.演示 ...
- Step by step 活动目录中添加一个子域
原创地址:http://www.cnblogs.com/jfzhu/p/4006545.html 转载请注明出处 前面介绍过如何创建一个域,下面再介绍一下如何在该父域中添加一个子域. 活动目录中的森林 ...
- SQL Server 维护计划实现数据库备份(Step by Step)(转)
SQL Server 维护计划实现数据库备份(Step by Step) 一.前言 SQL Server 备份和还原全攻略,里面包括了通过SSMS操作还原各种备份文件的图形指导,SQL Server ...
- 转:eclipse以及step into step over step return的区别
首先来讲一下step into step over step return的区别: step into就是单步执行,遇到子函数就进入并且继续单步执行:(F5) step over是在单步执行时,在函数 ...
随机推荐
- Linux文件权限管理
一.设置文件所属的用户以及所属的组(chown,chgrp) chgrp用来更改文件的组拥有者,其一般格式为:chgrp [option] group file(1)把文件test的组拥有者改为zfs ...
- hdu 4869 Turn the pokers (2014多校联合第一场 I)
Turn the pokers Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) ...
- 网页http请求的整个过程
这几天看一个讲解一个网页从我们输入地址到显示在我们面前的一个讲解,是我对http又有了一个完整的了解,现在做一下整个流程的记录,虽然不是很详细,但是整个过程是完整的.如果不对,请指正! 打开浏览器,地 ...
- Javascript中使用replace()方法+正则表达式替换掉所有字符
Js中的replace方法,只能替换掉第一次匹配到的字符, 而我们经常需要替换一个字符串中所有的匹配字符,这时候可以用正则表达式: str.replace(/a/g,"b"); ...
- 要将程序集“xxx.dll”标记为系统必备组件,必须对其进行强签名
最近编译经常偶尔出现标题这个错误,有时重启电脑,就正常了,有时重启也不行,真蛋疼,后来发现把dll预先拷贝到生成目录,也可以避免这个编译错误,但是实在是麻烦,再去Google了半天,终于找到了解决方案 ...
- 0115——cocoapod的使用
iOS 最新版 CocoaPods 的安装流程 1.移除现有Ruby默认源 $gem sources --remove https://rubygems.org/ 2.使用新的源 $gem sourc ...
- KMP与扩展KMP
原文转自:http://www.cppblog.com/MatoNo1/archive/2011/04/17/144390.aspx KMP:给出两个字符串A(称为模板串)和B(称为子串),长度分别为 ...
- CDZSC_2015寒假新人(1)——基础 h
Description Ignatius was born in a leap year, so he want to know when he could hold his birthday par ...
- [music]<蔷薇>
我在虾米音乐听到一首好听的歌曲<蔷薇>,一起来听吧!http://www.xiami.com/song/386109?ref=aother LOFTER:我们的故事 http://us ...
- 转:linux运维工程师
运维中关键技术点解剖:1 大量高并发网站的设计方案:2 高可靠.高可伸缩性网络架构设计:3 网站安全问题,如何避免被黑?4 南北互联问题,动态CDN解决方案:5 海量数据存储架构 一.什么是大型网站运 ...