会员管理系统的设计和开发(2)-- RDLC报表的设计及动态加载
在上篇《会员管理系统的设计和开发(1)》介绍了关于会员系统的一些总体设计思路和要点,经过一段时间开发,软件终于完成并发布。在这期间,碰到了不少技术难点,并积累了不少开发心得和经验,本篇继续介绍这个开发过程中相关的技术要点,主要介绍其中RDLC报表的相关操作,如报表的设计和通用的动态加载模块的处理等内容。
什么是RDLC呢,它的全称是Report Definition Language Client-Side,原来是微软基于SQL Server 报表服务中经提供了一种被称为报表定义语言(Report Definition Language, RDL)的改进版本,增加了客户端处理报表功能,在WinForm和WebForm中均可以使用这种报表。
1、RDLC报表的设计
我们知道,RDLC报表展现是基于一个定义的报表文件的,一般是以rdlc后缀名的报表文件,在VS里面新建一个项,选定报表文件即可,如下所示。

RDLC的报表设计界面,提供了很多相关的控件进行绘制。

通过这些操作我们可以创建一些报表的元素在里面,如可以增加一些数据字段和列表字段在里面,最简单的报表例子里面,可以增加一些图片,标题,列表等内容,如下所示。

但往往这个只是测试阶段的学习,一般情况下,我们的报表比上面的规范很多,要考虑样式还有布局设计等方面,下面给出一些我会员系统里面的报表例子供参考对比。
下面是一个会员消费清单的报表设计,包括总的消费情况和明细报表设计。

以及一个会员身份的打印报表设计。

设计报表完成,只是完成了一部分工作,我们还需要建立数据集,把字段绑定到报表上面去,如上面的[Name]这样标识的就是字段已经绑定的了,一开始这些可能是没有的,需要我们先创建数据集对象。

创建数据集对象,可以选择是DataSet类型的或者是实体类型的,网上介绍很多是基于DataSet方式的,由于我的Winform框架及整个系列的产品是基于实体类的,因此我的报表创建的数据集对象也是基于实体对象的。
从上面可以看出,创建的数据集对象,是引用我的实体类对象,里面包含了很多对象属性,非常容易理解。
创建了相应的数据集对象后,我们进一步就是把这些信息绑定到设计的报表上面了。
先在报表视图里面,把列表对象选中,绑定它的数据集对象,操作如下面两个图所示。


这样我们就可以随意指定列表里面的列的字段绑定操作了。

2、RDLC报表的动态加载
通过第一节介绍的报表设计和数据集对象的创建,然后进行绑定操作后,基本上设计部分就已经完成了,注意的就是调整好对应的格式,加载测试后进行微调整即可了。
本小节继续介绍,如何把数据进行动态加载进行绑定。
为了实现报表的预览,我们需要在UI项目里面添加下面两个程序集对象。

然后在一个预览报表的窗体里面,放置一个报表查看控件ReportViewer,设计报表预览界面窗体如下所示。

以后我们设计的报表,就准备通过这个界面进行展现的了。
通过ReportViewer我们可以获得LocalReport对象的引用,然后对它进行处理即可。
LocalReport report = this.rpViewer.LocalReport;
报表的数据绑定,主要就是增加报表对象里面的对应的ReportDataSource对象即可。
通过报表对象LocalReport,我们可以使用代码增加对应的数据源给它的报表对象,这样我们需要展现的报表数据源就可以和报表进行绑定了,具体的处理代码如下所示。

那么我们如何在界面窗体里面进行报表的绑定操作呢?
封装好通用的报表展现界面后,我们只需要调用他们的接口进行绑定一个新的报表和数据源了。具体代码如下所示。
private void menuPrintReport_Click(object sender, EventArgs e)
{
string headerID = this.winGridViewPager1.gridView1.GetFocusedRowCellDisplayText("ID");
if (!string.IsNullOrEmpty(headerID))
{
MemberConsumptionInfo consumptionInfo = BLLFactory<MemberConsumption>.Instance.FindByID(headerID);
if (consumptionInfo != null)
{
//修改一些属性值
//会员姓名
consumptionInfo.Data1 = BLLFactory<Member.BLL.Member>.Instance.GetNameByID(consumptionInfo.Member_ID);
consumptionInfo.Data2 = SecurityHelper.GetFullNameByID(consumptionInfo.Creator); List<MemberConsumptionInfo> list = new List<MemberConsumptionInfo>();
list.Add(consumptionInfo); List<ConsumptionDetailInfo> detailList = BLLFactory<ConsumptionDetail>.Instance.FindByBillNo(consumptionInfo.BillNo);
foreach (ConsumptionDetailInfo info in detailList)
{
//修改ProductID为商品编码
info.Product_ID = BLLFactory<MemberProduct>.Instance.GetHandNoByID(info.Product_ID);
} ReportViewerDialog dlg = new ReportViewerDialog();
dlg.DataSourceDict.Add("MemberConsumptionInfo", list);
dlg.DataSourceDict.Add("ConsumptionDetailInfo", detailList);
dlg.ReportName = "WHC.Member.ConsumptionReport"; AppConfig config = new AppConfig();
string companyName = config.AppConfigGet("CertificatedCompany");
dlg.Parameters.Add("CompanyName", companyName);
dlg.ShowDialog();
}
}
}
3、RDLC报表的展现效果
在上面两个小节里面,我们已经介绍过RDLC报表如何设计、如何绑定到ReportViewer报表预览界面上了,还有也说明了如何在主窗体里面使用数据源进行动态的加载操作,但到底具体的报表展现效果如何呢,下面我给出几个案例作为参考。
1)消费清单报表

2)收费记录报表

3)会员卡片打印报表

会员管理系统的设计和开发(2)-- RDLC报表的设计及动态加载的更多相关文章
- [RDLC]报表根据字段列动态加载图片(二)
参照:http://www.cnblogs.com/hcbin/archive/2010/03/26/1696803.html 改动地方value的值可以用报表的字段进行编辑. 效果:
- Android应用开发提高系列(4)——Android动态加载(上)——加载未安装APK中的类
前言 近期做换肤功能,由于换肤程度较高,受限于平台本身,实现起来较复杂,暂时搁置了该功能,但也积累了一些经验,将分两篇文章来写这部分的内容,欢迎交流! 关键字:Android动态加载 声明 欢迎转载, ...
- 爬虫开发6.selenuim和phantonJs处理网页动态加载数据的爬取
selenuim和phantonJs处理网页动态加载数据的爬取阅读量: 1203 动态数据加载处理 一.图片懒加载 什么是图片懒加载? 案例分析:抓取站长素材http://sc.chinaz.com/ ...
- Winform开发框架之客户关系管理系统(CRM)的开发总结系列4-Tab控件页面的动态加载
在前面介绍的几篇关于CRM系统的开发随笔中,里面都整合了多个页面的功能,包括多文档界面,以及客户相关信息的页面展示,这个模块就是利用DevExpress控件的XtraTabPage控件的动态加载实现的 ...
- Asp.Net Core 项目实战之权限管理系统(8) 功能菜单的动态加载
0 Asp.Net Core 项目实战之权限管理系统(0) 无中生有 1 Asp.Net Core 项目实战之权限管理系统(1) 使用AdminLTE搭建前端 2 Asp.Net Core 项目实战之 ...
- Excel催化剂开源第7波-VSTO开发中Ribbon动态加载菜单
在VS开发环境中,特别是VSTO的开发,微软已经现成地给开发者准备了设计器模式的功能区开发,相对传统的VBA.ExcelDna和其他方式的COM加载项开发来说,不需要手写xml功能区,直接类似拖拉窗体 ...
- 驱动开发学习笔记. 0.07 Uboot链接地址 加载地址 和 链接脚本地址
驱动开发学习笔记. 0.07 Uboot链接地址 加载地址 和 链接脚本地址 最近重新看了乾龙_Heron的<ARM 上电启动及 Uboot 代码分析>(下简称<代码分析>) ...
- Java动态加载类在功能模块开发中的作用
Java中我们一般会使用new关键字实例化对象然后调用该对象所属类提供的方法来实现相应的功能,比如我们现在有个主类叫Web类这个类中能实现各种方法,比如用户注册.发送邮件等功能,代码如下: /* * ...
- 使用jquery的load方法设计动态加载,并解决浏览器前进、后退、刷新等问题
继上一篇 使用jquery的load方法设计动态加载,并解决被加载页面JavaScript失效问题 解决了后台业务系统的部分动态加载问题,然而该框架离正常的用户体验还存在一些问题,如:浏览器的前进.后 ...
随机推荐
- .NET开发笔记(二十二) .NET VS Java
我们目前对.NET的理解大部分可以归纳为:起初它是Java平台(注意是平台,不要跟Java语言搞混淆)的一个克隆品,后来慢慢演变,有了自己的特性.由于Java平台最显著的特点就是“平台独立性”(或者说 ...
- 切换到ZSH以后遇到的坑
了解到ZSH的强大以后打算将自己目前使用的bash切换到ZSH.具体ZSH比bash强在那里就不多少了,网上的文章一搜一大把.个人主要是被ZSH强大的自动补全吸引过来的.虽然bash装了bash-co ...
- Knockout JS实现任务管理应用程序
1.1.1 摘要 在博文<Ember.js实现单页面应用程序>中,我们介绍了使用Ember JS实现一个单页应用程序 (SPA),这使我想起了几年前写过一个任务管理程序,通过选择日期,然后 ...
- 微软 Build 2016年开发者大会发布多项功能升级
微软Build 2016开发者大会在美国旧金山的莫斯康展览中心开幕.本次大会对一些重点功能进行了完善.如手写笔支持技术Windows Ink.语音识别Cortana应用集(Cortana Collec ...
- easy-ui JOB 及 小记录
$:获取 $.ajax({ type: "POST" , url: "" , cont ...
- 关于session的小结
session的原理 Session对象的原理在于,服务器可以为客户端创建并维护一个所谓的Session对象,用于存放数据. 在创建Session对象的同时,服务器将会为该Session对象产生一个唯 ...
- EF架构~数据分批批量提交
回到目录 对于大数据量提交,包括插入,更新和删除,我始终不建议用EF自带的方法,因为它会增加与数据库的交互次数,一般地,EF的一个上下文在提交时会打开一个数据连接,然后把转换成的SQL语句一条一条的发 ...
- Java的String字符串内容总结
String--字符串 获取字符串的长度 使用Sring类的length()方法可获取字符串对象的长度,例: str.length(); str代表指定的字符串对象;返回值为返回指定字符串的长度.例: ...
- 每天一个linux命令(8):cp 命令
cp命令用来复制文件或者目录,是Linux系统中最常用的命令之一.一般情况下,shell会设置一个别名,在命令行下复制文件时,如果目标文件已经存在,就会询问是否覆盖,不管你是否使用-i参数.但是如果是 ...
- MongoDB更新文档
说明:来看一下关系型数据库的update语句 UPDATE 表名称 SET 列名称 = 新值 WHERE 列名称 = 某 其中where子句就类似查询文本,定位要更改的子表,set子句类似于修改器,更 ...