RDLC报表的WPF的钻取实现

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(123, "内勤", "B3456123");
            dt.Rows.Add(234, "外勤", "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", "1");
            reportViewer.LocalReport.SetParameters((new ReportParameter[] { departmentId }));// 放入参数测试

            reportViewer.RefreshReport();
        }

        // 填充钻取的数据
        private void report_Drillthrough(object sender, DrillthroughEventArgs e)
        {
            int dId = 0;
            DataTable dt = MakeEmployeeDT();

            ReportDataSource reportDataSource = new ReportDataSource();

            reportDataSource.Name = "EmployeeDS";
            reportDataSource.Value = dt;

            Report newRV = e.Report;

            if (newRV.GetParameters().Count > 0 && newRV.GetParameters()["DepartmentId"] != null)
            {
                string tmp = newRV.GetParameters()["DepartmentId"].Values[0].Trim();
                dId = Int32.Parse(tmp, 0);
            }
            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(001, "张三", "John", 123);
            dt.Rows.Add(002, "李四", "Joo", 234);
            return dt;
        }

    }

总结/说明:

  1、本例使用实体对象作为绑定数据源,可以较好的整合进当前项目,维持现有架构的层级关系,另外也可直接配置数据库或WCF服务,请自行测试;

  2、新建数据源时若找不到step2建立的实体类,请重新编译项目

  3、初次接触者RDLC文件的xml源码图形化的布局设计都定义在里面。

  4、钻取目标表的结构结果筛选即可由rdlc定义完成,也可以获取参数后自行组装DataTable,前者简单省事,后者性能高一些,看需求~。

最后,贴一张运行效果图:

程序打包下载

时间: 2024-07-28 18:24:29

RDLC报表的WPF的钻取实现的相关文章

RDLC报表钻取空白页问题

在修改报表查询条件时,钻取页突然空白了,百思不得其解,之前好好的,研究了一个下午和一个晚上,查资料等等,网上很多资料都是设置报表的 ConsumeConteinerWhitespace = True 以及设置BODY的大小不能大于报表的SIZE,问同事,说是报表参数过多,正准备修改成一个参数,但是在删除参数时,想到之前刚做钻取时,因为参数不对所以显示不出来,设置了允许空和允许NULL,才显示出来数据,一查,有个新增参数果然没设,设了之后立即显示出来了,大意了,这种小问题,特记下来,以后认真对待问

Asp.net中动态控制RDLC报表 自定义RDLC

转载自: http://dlwang2002.cnblogs.com/archive/2006/05/27/410499.html 在asp.net程序中,可以选择使用水晶报表,功能确实强大.但是web版的水晶报表好像存在版权的问题.如果所作报表不是复杂的一塌糊涂的话,可以使用微软自带的Rdlc报表.已经有老兄做出了不少诠释:http://www.cnblogs.com/waxdoll/更多资料可以在这里找到:http://www.gotreportviewer.com/Rdlc优点:1:Rdl

vs 2015 rdlc报表绑定datagridview中的数据

这几天一直想要实现rdlc报表绑定datagridview中的数据,始终在虚拟表向rdlc报表绑定这一步上出错.今天从下午4点到七点四十一直在尝试.最终还是实现了,最然并不知所以然,这个问题还是以后在考虑吧,目前的项目要紧. 首先是  datagridview中的数据传到虚拟表中. for (int i = 0; i < dgvscan.Columns.Count - 1; i++) { dtout.Columns.Add(dgvscan.Columns[i].Name); } //添加行 fo

RDLC报表之动态生成报表

首先,必须感谢和致敬蜡人张前辈: http://waxdoll.cnblogs.com/archive/2006/02/25/337713.html 2.微软GotReportViewer官方的案例: http://www.gotreportviewer.com/(约有20来个,很详细.有时候会上不了) ) 前段时间,做了RDLC报表,主要是三块功能: 1.从DataGrid提取数据,然后创建对应的RDLC报表文件,以利用ReportViewer类的打印排版的功能(其中做了个提取数据的通用函数,

DevExpress的XtraReport和微软RDLC报表的使用和对比

原文:DevExpress的XtraReport和微软RDLC报表的使用和对比 我们开发程序的时候,经常会碰到一些报表,如果是Winform的报表,一般可以采用DevExpress控件组的XtraReport,或者微软的RDLC报表,当然还有一些其他的,在此不再赘述.由于本人在Winform开发中经常使用到一些报表,有时候使用XtraReport报表,有时候也使用RDLC报表,因此本篇主要介绍这两种不同类型报表的使用,以及对比它们的差异性,以便我们更好的掌握了解. 1.XtraReport报表的

mvc 在view视图中直接输出rdlc报表文件(Excel、PDF、Word)

给一段代码做参考 public ActionResult RdlcReport(string code) { LocalReport localReport = new LocalReport(); EasyMan.Dtos.ErrorInfo err = new EasyMan.Dtos.ErrorInfo(); err.IsError = false; try { var report = _reportAppService.GetReport(code, 0, false); DataTa

在mvc视图中实现rdlc报表展示

需求:在view视图页面中嵌入rdlc报表,rdlc的xml为动态传入的xml字符串.本项目是基于abp框架 可能出现问题: 1.rdlc报表是由asp.net的服务器控件ReportViewer来支持的,view视图不能直接使用服务器控件 2.ReportViewer需要通过aspx页面来承载,并在服务端事件中完成对控件的xml绑定.datatable绑定 3.由于是基于abp框架的项目,不能在aspx.cs后台页面中直接实例化IxxAppService接口的实现类 想达到的效果如下图: 上部

基于MVC+EasyUI的Web开发框架经验总结(15)--在MVC项目中使用RDLC报表

RDLC是一个不错的报表,有着比较不错的设计模式和展现效果,在我的Winform开发里面,使用RDLC也是一个比较方便操作,如可以参考文章<DevExpress的XtraReport和微软RDLC报表的使用和对比>或者<会员管理系统的设计和开发(2)-- RDLC报表的设计及动态加载>进行了解.但是基于MVC方式,如何构建和展现RDLC报表呢?本文主要介绍如何在基于MVC4+EasyUI的Web开发框架上进行RDLC的集成和使用. 1.RDLC绑定数据源 RDLC的报表设计,是使用

RDLC报表:每页显示N条记录

摘要: 提供一种方案,使分页浏览的报表每页显示固定条数记录,最后一页记录条数不足的,用空行补齐. 示例: 记录共7条,每页显示5条记录: 下载代码(vs2008,需要安装AdventureWorks数据库) 下载代码(vs2008,不需要数据库支持) 下载代码(仅rdlc报表定义文件) 原理: 由于表的分组包含“在起始处分页”和”在结束处分页”的功能,所以我们考虑先将数据分成若干个记录条数为N的组, 再启用“在结束处分页”的功能. 那么,如何分组呢?考虑记录的下标为 0,1,2,3... 的自然