会员管理系统的设计和开发(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失效问题 解决了后台业务系统的部分动态加载问题,然而该框架离正常的用户体验还存在一些问题,如:浏览器的前进.后 ...
随机推荐
- 由一篇文章引发的思考——多线程处理大数组
今天领导给我们发了一篇文章文章,让我们学习一下. 文章链接:TAM - Threaded Array Manipulator 这是codeproject上的一篇文章,花了一番时间阅读了一下.文章主要是 ...
- 我的第一个Linux C 程序
说明:上篇博客把gcc安装了,接着我们就尝试一下她的厉害吧. 我用的是vi的超级版本vim.这条指令,也就是用vim打开这个文件,如果文件不存在的话,那么创建这个文件. 关于Linux文件的创建,也可 ...
- C/C++ char* arr与char arr[]的区别(反汇编解析)
写作日期:2016.08.31 修改日期:2016.09.01 .2016.09.02. 交流qq:992591601 用了几天时间复习了下C语言.对于C语言的字符串操作有些不习惯,于是作为练习,写下 ...
- atitit 业务 触发器原理. 与事件原理 docx
atitit 业务 触发器原理. 与事件原理 docx 1.1. 呵呵,你需要需要一个业务 触发器..1 1.2. 触发器/事件/中断的原理1 1.3. Io 硬件中断的原理( 中断的低层有cpu轮询 ...
- SqlServer 错误1053:服务并未及时响应启动或控制请求
sqlserver 的登录用户修改成域账户后,启动不了 解决方法: 计算器管理选择管理员组 将域账户加入到管理员组即可
- fir.im Weekly - 论个人技术影响力是如何炼成的
每个圈子都有一群能力强且懂得经营自己的人,技术圈也是如此.本期 fir.im Weekly 一如往期精选了一些实用的 iOS,Android 开发工具和源码分享,还有一些关于程序员的成长 Tips 和 ...
- Git使用相关
Git使用相关 使用git这么久还是时不时碰到小问题,根本原因在于没有仔细研究和做笔记 Git修改remote地址 之前一直使用的ssh的地址,估计是没配置好,每次都需要输密码烦死了,今天看到个用ht ...
- java webservice 总结(学会读别人的webservice并且通过代理模式访问)
公司做的系统之间的交互用到了webservice做交互,现在对webservice做一个总结. 1.配置已有的webservice webservice主要包括 xml/json:作为传输数据的格式 ...
- LigerUI Tree
<!DOCTYPE html> <%@ page language="java" contentType="text/html; charset=utf ...
- Android入门(十三)内容提供器
原文链接:http://www.orlion.ga/612/ 内容提供器(Content Provider)主要用于在不同的应用程序之间实现数据共享的功能,它提供了一套完整的机制,允许一个程序访问另一 ...