提到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的下一个版本可以对此功能进行改进。