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是在单步执行时,在函数 ...
随机推荐
- phpStudy + JspStudy 2014.10.02 下载
phpStudy + JspStudy 2014.10.02 下载 目标:让天下没有难配的php环境. phpStudy Linux版&Win版同步上线 支持Apache/Nginx/Teng ...
- 获取客户端IP地址定位城市信息
获取客户端IP地址定位城市信息 1.首先获取客户端的IP地址 function getIPaddress(){ $IPaddress=''; if (isset($_SERVER)){ if (iss ...
- Python网络爬虫(6)--爬取淘宝模特图片
经过前面的一些基础学习,我们大致知道了如何爬取并解析一个网页中的信息,这里我们来做一个更有意思的事情,爬取MM图片并保存.网址为https://mm.taobao.com/json/request_t ...
- jQuery 事件 - error() 方法
实例 如果图像不存在,则用一段预定义的文本取代它: $("img").error(function(){ $("img").replaceWith(" ...
- Android 平滑图片加载和缓存库 Glide 使用详解
在图片加载库烂大街的今天,选择一个适合自己使用的图片加载库已经成为了每一个Android开发者的必经之路.现在市面上知名的图片加载库有UIL,Picasso,Volley ImageLoader,Fr ...
- emjio表情转json
今天碰到了上传文字给服务端的时候emjio表情转成json就不对了 有大神帮忙解决了,记笔记记笔记--- #import "NSString+EncodedString.h" @i ...
- iPad学做菜
项目描述:家常菜.川菜 .鲁菜.东北菜.甜品等各大菜系应有尽有,详细的制作步骤,再也不用为自己不会做饭而烦恼. 主要技术:主界面采用UISplitViewController的结构设计:自定义各大菜系 ...
- 没有暑假的Ada 要好好努力咯 C#继续
- IIS Hang Troubleshoot
Your website maybe stop working and response very lowly. How to find out the reason? Below are the g ...
- 跨平台渲染框架尝试 - Texture管理
纹理是渲染器重要的资源,也是比较简单的资源.本文将详细讨论纹理资源的管理. 在资源管理概述中提到,资源就是一堆内存和CPU与GPU的访问权限.纹理管理在资源管理之上,要负责如何使用者一堆内存构造纹理对 ...