会员管理系统的设计和开发(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 面向对象编程基础] (22) 事件
[.net 面向对象编程基础] (22) 事件 事件(Event)是学习.net面向对象编程很重要的一部分,在学习事件之前,我们实际上已经在很多地方使用了事件,比如控件的click事件等,这些都是. ...
- FusionCharts简单教程(三)-----如何自定义图表上的工具提示
最近有蛮多人总是问我这个FusionCharts制表的问题,帮助他们解决之后,在昨晚发现以前整理的笔记中有这个简单教程,而且以前也发表了几篇这个博文,所以就将其全部上传上来供别人参考.如有不正确之处望 ...
- Linux 比较判断运算(if test)
200 ? "200px" : this.width)!important;} --> 介绍 本篇文章主要是列举在shell命令中常出现的一些用来做比较的运算符,这些运算符是 ...
- Ubuntu环境搭建系列—WPS/LAMP/Python篇
由于篇幅不宜太长,所以就将此文分成了两部分,在第一部分中我们讲解了google-chrome(谷歌浏览器)的安装,jdk的环境配置,android开发的环境搭建.那么在第二部分中,位们将讲解的是金山W ...
- [开源]微信在线信息模拟测试工具(基于Senparc.Weixin.MP开发)
目前为止似乎还没有看到过Web版的普通消息测试工具(除了官方针对高级接口的),现有的一些桌面版的几个测试工具也都是使用XML直接请求,非常不友好,我们来尝试做一个“面向对象”操作的测试工具. 测试工具 ...
- redis系列-redis的持久化
redis对数据的持久化有两种方式:RDB(快照保存)和AOF(命令日志). RDB 介绍:将内存快照保存到磁盘,dump.rdb二进制文件 触发:满足“N 秒内数据集至少有 M 个改动”,或使用sa ...
- iOS ---Extension编程指南
当iOS 8.0和OS X v10.10发布后,一个全新的概念出现在我们眼前,那就是应用扩展.顾名思义,应用扩展允许开发者扩展应用的自定义功能和内容,能够让用户在使用其他app时使用该项功能.你可以开 ...
- :after和:before炫酷用法总结
引入 提到伪类,在我的印象中最常用的不过是:hover.:active.:link.:visited,还有css3里的常用伪类选择器:last-child.:first-child.nth-child ...
- Python数据类型之“文本序列(Text Sequence)”
Python中的文本序列类型 Python中的文本数据由str对象或字符串进行处理. 1.字符串 字符串是Unicode码值的不可变序列.字符串字面量有多种形式: 单引号:'允许嵌入"双&q ...
- hdu4750Count The Pairs(最小生成树找瓶颈边)
/* 题意:就是给你一个图,图的每两个点都有多条路径,每一条路径中都有一条最大边, 所有最大边的最小边(也就是瓶颈边)就是这两点之间的val值!然后给你一个值f, 问有多少个顶点对的val>=f ...