提到SSRS 那么就不得不提一下自定义代码的功能,通过自定义代码,有时候可以解决一些比较复杂的问题,比如将让指定的数据行应用指定的属性值。此篇将演示如何通过简单结构的自定义代码进行报表样式的基本设计。

注:此篇虽然演示的是RDLC报表,但是在RDL报表中自定义代码这部分是通用的,没有任何区别。(不得不说我更愿意用RDLC报表这种通过代码提供数据源的方式,虽然有些麻烦但在数据的组织上要更灵活一些。)

首先新建一个ASP.NET WebForm项目,建立一个类文件,里面包含一个DateItem类作为数据容器,此外增加一个DataProvider类提供RDLC报表数据源。

然后创建一个测试asp.net页面承载Report Viewer控件,最后创建一个rdlc报表页面。

最终解决方案目录如下所示:

在asp.net页面中依次放入scriptmanager控件以及ReportViewer控件。

打开rdlc文件,添加数据源,然后按如下设计报表:

在数据源提供者的方法中,加入一些测试数据。

关于创建RDLC报表以及通过代码为报表提供数据源的详细方式,可以参考我的这篇随笔

浏览项目,可以看到报表最初默认的效果。

接下来为报表添加自定义代码丰富这张报表,方法是右键点击报表空白区域,然后点击Report Properties…

在Report Properties界面中,点击Code,在右边的Customer Code输入自定义代码。

添加如下代码:

Public Function ROWDESC(ROWHEADER AS String) AS String

SELECT CASE ROWHEADER

CASE "M": Return "餐费"

CASE "M1": Return "早餐"

CASE "M2": Return "午餐"

CASE "M3": Return "晚餐"

CASE "L": Return "市场"

CASE "L1": Return "蔬菜"

CASE "L2": Return "肉类"

CASE "L3": Return "水果"

CASE "T": Return "交通"

CASE "T1": Return "地铁"

CASE "T2": Return "公交"

CASE "T3": Return "火车"

CASE "T4": Return "飞机"

END SELECT

END Function

这段代码的结构不是很复杂,相信有编程基础的朋友看过一遍就知道是什么意思了。代码主要是SWITCH CASE结构,根据传递进来的Title不同而显示不同的行头。

然后右键点击报表内容的行头,点击菜单中的Expression…

在表达式界面中输入如下代码:

在属性中应用代码的方式就是=Code.方法名。

浏览报表,可以看到报表内容的行头已经根据代码发生了变化。

接下来对报表的边框进行一下特殊的边框设置,比如下面的效果,行头是带有上下边框的,以及汇总行也是带有上下边框的。

这个效果常规方法很难设计出来,但是通过自定义代码就可以轻松搞定。

再为报表添加如下代码:

Public Function UPBORDER(ROWHEADER AS String) AS String

SELECT CASE ROWHEADER

CASE "M": Return "Solid"

CASE "L": Return "Solid"

CASE "T": Return "Solid"

END SELECT

END Function

Public Function DOWNBORDER(ROWHEADER AS String) AS String

SELECT CASE ROWHEADER

CASE "M": Return "Solid"

CASE "L": Return "Solid"

CASE "T": Return "Solid"

CASE "T4": Return "Solid"

END SELECT

END Function

同样也是简单的SWITCH CASE结构,这些代码一个是设置行顶边框的,一个是设置行底边框的,通过判断其Title的属性来决定是否有上边框和下边框。

选中报表内容行,在属性中找到BorderStyle属性集,依次找到Top和 Bottom进行如下设置:

这样就实现了特殊边框的效果。

有时候我们希望汇总行的字体是加粗的,这个也很容易。首先添加下面的代码。

Public Function ISBOLD(ROWHEADER AS String) AS String

SELECT CASE ROWHEADER

CASE "M": Return "Bold"

CASE "L": Return "Bold"

CASE "T": Return "Bold"

END SELECT

END Function

然后将这个代码应用到FontStyle属性中。

浏览报表,可以看到如下效果:

至此,你可以看到通过自定义代码,一些复杂样式的实现就相对容易一些,灵活运用自定义代码,将起到事半功倍的效果,尤其是根据不同的数据行套用不同的样式。

不得不所报表的自定义代码编写起来比编写Javascript还要痛苦,因为它基本上就是一个文本编辑器,没有任何智能感知等辅助代码的功能,所以在编写的时候需要不断去尝试和测试。但总体来说通过自定义代码实现复杂的功能确实要清晰和容易很多。希望RS的下一个版本可以对此功能进行改进。

示例代码下载

玩转SSRS第十篇---自定义代码的更多相关文章

  1. 15天玩转redis —— 第十篇 对快照模式的深入分析

    我们知道redis是带有持久化这个能力了,那到底持久化成到哪里,持久化成啥样呢???这篇我们一起来寻求答案. 一:快照模式 或许在用Redis之初的时候,就听说过redis有两种持久化模式,第一种是S ...

  2. SQL Server Reporting Service(SSRS) 第五篇 自定义数据处理扩展DPE(Data Processing Extension)

    最近在做SSRS项目时,遇到这么一个情形:该项目有多个数据库,每个数据库都在不同的服务器,但每个数据库所拥有的数据库对象(table/view/SPs/functions)都是一模一样的,后来结合网络 ...

  3. 我的MYSQL学习心得(十) 自定义存储过程和函数

    我的MYSQL学习心得(十) 自定义存储过程和函数 我的MYSQL学习心得(一) 简单语法 我的MYSQL学习心得(二) 数据类型宽度 我的MYSQL学习心得(三) 查看字段长度 我的MYSQL学习心 ...

  4. 第十篇 Integration Services:高级事件行为

    本篇文章是Integration Services系列的第十篇,详细内容请参考原文. 简介在前一篇, we introduced fault tolerance by examining method ...

  5. 第十篇 SQL Server安全行级安全

    本篇文章是SQL Server安全系列的第十篇,详细内容请参考原文. 不像一些其他industrial-strength数据库服务,SQL Server缺乏一个内置保护个别数据记录的机制,称为行级安全 ...

  6. Python开发【第二十篇】:缓存

    Python开发[第二十篇]:缓存redis&Memcache   点击这里 Python之路[第九篇]:Python操作 RabbitMQ.Redis.Memcache.SQLAlchemy ...

  7. 【译】第十篇 SQL Server安全行级安全

    本篇文章是SQL Server安全系列的第十篇,详细内容请参考原文. 不像一些其他industrial-strength数据库服务,SQL Server缺乏一个内置保护个别数据记录的机制,称为行级安全 ...

  8. 【译】第十篇 Integration Services:高级事件行为

    本篇文章是Integration Services系列的第十篇,详细内容请参考原文. 简介在前一篇, we introduced fault tolerance by examining method ...

  9. 跟我学SpringCloud | 第十篇:服务网关Zuul高级篇

    SpringCloud系列教程 | 第十篇:服务网关Zuul高级篇 Springboot: 2.1.6.RELEASE SpringCloud: Greenwich.SR1 如无特殊说明,本系列教程全 ...

随机推荐

  1. Tomcat配置文件server.xml详解

    <?xml version='1.0' encoding='utf-8'?> <Server port="8005" shutdown="SHUTDOW ...

  2. JAVA调用动态链接库DLL之JNative学习

    package com.ehfscliax; import java.io.UnsupportedEncodingException;import java.net.URLEncoder;import ...

  3. windows下安装Apache 64bit

    文件下载:http://pan.baidu.com/s/1c0oDjFE 一.Apache的安装 http://www.blogjava.net/greatyuqing/archive/2013/02 ...

  4. Android之EditText自定义边框和边框颜色(转载)

    介绍一种比较常见的用法 第一步:准备两张图片大小一样,颜色不同的图片.图片名称分为:editbox_focus.png和editbox_normal.png 放入工程的drawable文件夹下. 第二 ...

  5. linux下的audit服务

    audit   ['ɔːdɪt]  审计 auditd是linux的一个审计服务. 这是man下的解释 auditd is the userspace component to the Linux A ...

  6. cxGRID中的字段怎么能以0.00的格式显示

    CXGRID中的字段如何能以0.00的格式显示在CXGRID中如何让字段能以0.00的格式显示,我的字段是FLOAT类型,满意的马上给分! ------解决方案-------------------- ...

  7. 2.js模式-单例模式

    1. 单例模式 单例模式的核心是确保只有一个实例,并提供全局访问. function xx(name){}; Singleton.getInstance = (function(){ var inst ...

  8. FFmpeg-20160506-snapshot-bin

    ESC 退出 0 进度条开关 1 屏幕原始大小 2 屏幕1/2大小 3 屏幕1/3大小 4 屏幕1/4大小 S 下一帧 [ -2秒 ] +2秒 ; -1秒 ' +1秒 下一个帧 -> -5秒 F ...

  9. Python~函数的参数

    def func(a,b,c,*args,**kw): print('a=',a,'b=',b,'c=',c,'args=',args,'kw=',kw) 必选参数,默认参数,可变参数,关键字参数 d ...

  10. Python 开发轻量级爬虫03

    Python 开发轻量级爬虫 (imooc总结03--简单的爬虫架构) 现在来看一下一个简单的爬虫架构. 要实现一个简单的爬虫,有哪些方面需要考虑呢? 首先需要一个爬虫调度端,来启动爬虫.停止爬虫.监 ...