WPF中RDLC报表的钻取实现
1、新建wpf项目,并引入3个程序集:
Microsoft.ReportViewer.WinForms
WindowsFormsIntegration
System.Windows.Forms
如果无法搜索到,可能是VS没有安装相关组件,请如图添加:
2、新建Entities文件夹,在其中添加Entities.cs文件,其中创建两个实体类,Department和Employee
- class Department
- {
- public int DepartmentId { get; set; }
- public string DepartmentName { get; set; }
- public string DepartmentInfo { get; set; }
- }
- class Employee
- {
- public int EmployeeId { get; set; }
- public int DepartmentId { get; set; }
- public string Name { get; set; }
- public string NickName { get; set; }
- }
3、创建钻取表——部门表Department.rdlc,内部控件可在工具箱窗口创建:
3.1、绑定数据集/源,在Report Data中的数据集项目右键-添加数据集(名称为:DepartmentDS)-新建数据源-对象,下一步选择sep2中建立的Department对象。
3.2、完成后即可将数据源的字段添加如报表中。
3.3、在DepartmentId中右键-文本框属性-操作-选择“转到报表”,指定报表填入“Emploee”(此报表下一步创建)参数填入DepartmentId:
再设置一下钻取关键字的字体样式,钻取表配置完成。
4、创建目标表——员工表Employee:
4.1、添加绑定Employee对象,操作如部门表,数据集名称指定为:(名称为:EmployeeDS)。
4.2、定义参数,Report Data窗口中:参数右键-添加参数,名称填入DepartmentId,类型为Integer(要与传入类型一致)。
4.3、添加筛选器,筛选器可以采用指定参数来自动过滤数据,选择数据集所在行右键-tablix属性-筛选器-点击fx进入表达式编写。
其中表达式填入:=CInt(Fields!DepartmentId.Value)类型为Integer,运算符为“=”,值填入:=CInt(Parameters!DepartmentId.Value)
到此,报表主要设计完成。
5、在MainWindow窗体中放入ReportViewer:
5.1、xaml窗口代码,先引入命名空间:xmlns:rv="clr-namespace:Microsoft.Reporting.WinForms;assembly=Microsoft.ReportViewer.WinForms"
然后主体部分:
- <Grid>
- <WindowsFormsHost>
- <rv:ReportViewer x:Name="reportViewer"/>
- </WindowsFormsHost>
- </Grid>
5.2、窗口交互代码,功能是为报表填充数据,数据介质是DataTable,内容正是对应的实体类。
- public partial class MainWindow : Window
- {
- public MainWindow()
- {
- InitializeComponent();
- this.Loaded += DepartmentLoaded;
- //this.Loaded += EmployeeLoaded;
- }
- // 载入部门报表
- private void DepartmentLoaded(object sender, RoutedEventArgs e)
- {
- // 模拟一个DataTable
- DataTable dt = new DataTable();
- dt.Columns.Add("DepartmentId", typeof(int));
- dt.Columns.Add("DepartmentName", typeof(string));
- dt.Columns.Add("DepartmentInfo", typeof(string));
- dt.Rows.Add(, "内勤", "B3456123");
- dt.Rows.Add(, "外勤", "U3884912");
- ReportDataSource reportDataSource = new ReportDataSource();
- reportDataSource.Name = "DepartmentDS";
- reportDataSource.Value = dt;
- reportViewer.Reset();
- reportViewer.LocalReport.ReportPath = Directory.GetCurrentDirectory() + "\\Department.rdlc";
- reportViewer.LocalReport.DataSources.Add(reportDataSource);
- reportViewer.Drillthrough += new DrillthroughEventHandler(report_Drillthrough);// 处理钻取事件
- reportViewer.RefreshReport();
- }
- // 载入员工报表
- private void EmployeeLoaded(object sender, RoutedEventArgs e)
- {
- // 模拟一个DataTable
- DataTable dt = MakeEmployeeDT();
- ReportDataSource reportDataSource = new ReportDataSource();
- reportDataSource.Name = "EmployeeDS";
- reportDataSource.Value = dt;
- reportViewer.Reset();
- reportViewer.LocalReport.ReportPath = Directory.GetCurrentDirectory() + "\\Employee.rdlc";
- reportViewer.LocalReport.DataSources.Add(reportDataSource);
- ReportParameter departmentId = new ReportParameter("DepartmentId", "");
- reportViewer.LocalReport.SetParameters((new ReportParameter[] { departmentId }));// 放入参数测试
- reportViewer.RefreshReport();
- }
- // 填充钻取的数据
- private void report_Drillthrough(object sender, DrillthroughEventArgs e)
- {
- int dId = ;
- DataTable dt = MakeEmployeeDT();
- ReportDataSource reportDataSource = new ReportDataSource();
- reportDataSource.Name = "EmployeeDS";
- reportDataSource.Value = dt;
- Report newRV = e.Report;
- if (newRV.GetParameters().Count > && newRV.GetParameters()["DepartmentId"] != null)
- {
- string tmp = newRV.GetParameters()["DepartmentId"].Values[].Trim();
- dId = Int32.Parse(tmp, );
- }
- LocalReport localReport = (LocalReport)e.Report;
- localReport.DataSources.Add(reportDataSource);
- //reportViewer.RefreshReport();// 钻取操作不能refresh,否则会导致刷新窗口,清除钻取记录
- }
- // 创建员工数据表
- private DataTable MakeEmployeeDT()
- {
- DataTable dt = new DataTable();
- dt.Columns.Add("EmployeeId", typeof(int));
- dt.Columns.Add("Name", typeof(string));
- dt.Columns.Add("NickName", typeof(string));
- dt.Columns.Add("DepartmentId", typeof(string));
- dt.Rows.Add(, "张三", "John", );
- dt.Rows.Add(, "李四", "Joo", );
- return dt;
- }
- }
总结/说明:
1、本例使用实体对象作为绑定数据源,可以较好的整合进当前项目,维持现有架构的层级关系,另外也可直接配置数据库或WCF服务,请自行测试;
2、新建数据源时若找不到step2建立的实体类,请重新编译项目。
3、初次接触者RDLC文件的xml源码图形化的布局设计都定义在里面。
4、钻取目标表的结构结果筛选即可由rdlc定义完成,也可以获取参数后自行组装DataTable,前者简单省事,后者性能高一些,看需求~。
最后,贴一张运行效果图:
WPF中RDLC报表的钻取实现的更多相关文章
- Vs2010中rdlc报表绑定DataTable数据源
首先,新建一个网站,接着添加数据集,并且命名为student,如下图所示: 在该数据集对象上面添加datatable,并且设置列名,如下图所示: 添加一张报表,命名为student,如下图所示: 向报 ...
- C#中RDLC报表常用表达式(字符串和转换)
字符串函数 (1)使用串联运算符和 Visual Basic 常量可将多个字段组合在一起.以下表达式返回两个字段,它们分别位于同一文本框的不同行中:=Fields!FirstName.Value &a ...
- C#中RDLC报表判断某字段的值为null
=iif(Isnothing(Fields!VerifyStateName.Value),"未上报",Fields!VerifyStateName.Value) 空值时赋予默认 ...
- C#中RDLC报表中日期显示格式
转换为日期类型再格式化 =CDate(Fields!UseDate.Value).ToString("yyyy-MM-dd") 使用Format ==Format(Fields!C ...
- win10下rdlc报表在vs(visual studio)中中文显示小方块的批量处理解决方法
在网上找vs中rdlc报表显示中文时显示小方块的解决方案,无外就是修改文本框的字体属性.但是对于维护已有的rdlc报表时,有中文的地方(此时都显示了小方块)会很多,再一个一个设置实在太麻烦.所以自己花 ...
- [转]使用RDLC报表
使用RDLC报表(一) 1 建立数据源 启动VS2005新建一个窗体项目,命名为TestProj 在左边的窗体内选择“添加新数据源”或在菜单上操作“添加新数据源”: 选择后出现对话窗体,选 ...
- WPF中使用ReportViewer报表
本篇博客将介绍如何在WPF中使用ReportViewer控件. 1. 环境准备:下载安装最新版ReportViewer(PS:需要安装Microsoft SQL Server System CLR T ...
- 让rdlc报表在ReportViewer中水平居中的方法
正常情况下,rdlc报表在Reportviewer中是居左显示的,如图: 在Reporviewer的属性中,我没有找到能让rdlc的居中显示的方法.网上其他人用的方法都试了,没能实现,只能自己找方法解 ...
- VSTO 学习笔记(六)在 Excel 2010中使用RDLC报表
原文:VSTO 学习笔记(六)在 Excel 2010中使用RDLC报表 Excel具有强大的图表显示.分析功能,这点毋庸置疑,但是如果将常规MIS系统中的数据以报表的形式在Excel中显示,却并不那 ...
随机推荐
- java线程池ThreadPoolExecutor理解
Java通过Executors提供四种线程池,分别为:newCachedThreadPool创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程.newFixe ...
- java文件编程总结
文件编程之一就是文件操作,就是新建,删除,复制,更名 新建文件用createNewFile()方法,要处理IOException异常 新建文件夹用mkdirs()方法 删除一个文件和一个空的文件夹直接 ...
- TurboDemo软件使用教程:视频编辑
视频软件TurboDemo中不仅可以快速的捕捉屏幕,而且可以对视频进行编辑,本文来详细的了解一下这个步骤. 当你完整屏幕捕捉和录制后,点击系统托盘上的箭头或点击键盘上的“print screen”键之 ...
- chrome + vi
vimer们福利,一款能在chrome上面使用vim快捷键的插件 http://myhozz.com/2014/10/25/use-vim-in-chrome/
- 创建如下三个类:(People类中的三个方法分别输出一些信息,ChinaPeople 和AmericanPeople类重写父类的三个方法)。
创建如下三个类:(People类中的三个方法分别输出一些信息,ChinaPeople 和AmericanPeople类重写父类的三个方法). ackage com.chuoji.text01; pub ...
- 最常用的ES6特性
遇到了要写出es6新特性的题目,所以查阅了资料来总结一下,点击查看原文. 进入正题,最常用的ES6特性有:let, const, class, extends, super, arrow functi ...
- cf 710 E Generate a String
题意: 开始你有数字$0$,你可以用代价$x$将该数字加$1$或减$1$(当$x > 0$时),或用代价$y$将该数字变为$2x$,那么问得到数字$n$所需的最少代价是多少. 数据范围$1 \l ...
- ROCKETMQ源码分析笔记1:tools
rocketmq源码解析笔记 大家好,先安利一下自己,本人男,35岁,已婚.目前就职于小资生活(北京),职位是开发总监. 姓名DaneBrown 好了.我保证本文绝不会太监!转载时请附上以上安利信息. ...
- 28-React state提升、组件组合或继承
Lifting State Up state提升 对于在React应用程序中更改的任何数据,应该有一个单一的数据源.通常,都是将state添加到需要渲染的组件.如果其他组件也需要它,您可以将其提升到最 ...
- TCP/IP基础概念及通信过程举例
TCP/IP基础概念及通信过程举例 出现 上个世纪60年代,由于中央集中式网络的容灾性较弱,以美国国防部为中心的一家组织研究出分组交换网络.后来为了验证分组交换技术的实用性,ARPANET出现了,并且 ...