当前位置 > 首页 > Asp.net

[.NET] RDLC循环处理数据

2012-7-19 14:31:00来源:Asp.net

当我们在使用RDLC开发报表的时候,如果数据源内容如下。

 

private List<UserData> CreateDataSet(){    List<UserData> userDataSet = new List<UserData>();    userDataSet.Add(new UserData() { Name = "Clark", Age = 18 });    userDataSet.Add(new UserData() { Name = "Yaya", Age = 15 });    return userDataSet;}

 

我们可以很快速的使用RDLC里的数据表控件,来将数据呈现在报表上。

 

 

但是当客户要求下图的报表,要将数据源内容显示在一行。RDLC处理这种需求就没有那么简单,这是因为RDLC没有循环处理的函式可以使用。造成开发人员必须要组合数据,使用隐藏列表、在外部组合字符串…等等迂回的方式建立报表内容。但这样的方式开发,既没有效率而且也有很多的限制。

 

 

这个问题困扰了我好几天,昨晚睡到一半忽然有灵感。可以使用RDLC里的Sum函式,来做数据循环的处理。

 

Sum函式会取得数据集中的每一笔资料,并且计算出全部数据的总和。我们可以将表达式写为下列的函式,利用code.PushStringStack这个RDLC自定义函式,来让Sum函式取得所有数据。这样的写法,就可以将数据集中的每一笔数据都交由code.PushString处理过一次。

 

=Sum(code.PushString(Fields!Name.Value, Fields!Age.Value), "UserDataSet") 

 

接着看code.PushString这个RDLC自定义函式的内部,使用了一个Static的字符串变量,来记录每一笔数据处理之后的结果。到这边开发人员应该可以理解,这样的方式就是在跑循环处理数据。

 

Public Shared _foreachResult As String = String.EmptyPublic Shared Function PushString(userName As String, userAge As String) As Integer    _foreachResult += userName & "(" & userAge & "), "    Return 0End Function

 

当然啦,跑完循环处理完数据,最终还是要将数据显示在画面上。这边很简单的就是建立一个code.PopString回传。

 

Public Shared Function PopString() As String    Return _foreachResultEnd Function

 

并且将原本的表达式改写成为:

 

=IIF(Sum(code.PushString(Fields!Name.Value, Fields!Age.Value), "UserDataSet") <> 0, "", code.PopString())

 

编译并且执行之后,就可以看到在RDLC的文本框里,已经正确的显示了客户要求的数据格式。

 

 

范例程序 : RdlcForeachDataSample点此下载。

 

(为了方便说明思路,简化了设计。开发人员应依照实际情景建立实作。)


本文链接



  • Loading a Template From a User Control

    2010-3-22 15:58:00

    What if you wanted to load a template ( ITemplate property) from an external user control (.ascx

  • EXT.NET复杂布局(二)——复杂表单布局

    2011-8-8 16:06:00

    在开发中,我们总是会遇到很多比较复杂的表单。那么,怎么对这些复杂表单进行布局无疑是一个值得思考的问题,这往往也折磨着很多程序员。那么本节就来讲述如何使用EXT.NET对复杂的表单进行布局。 没啥

  • Artigos do ASP.NET Dynamic Data no TechEd 2009

    2009-8-27 2:33:00

    Pessoal, algumas pessoas me questionaram os links dos meus artigos sobre o ASP.NET Dynamic Data que

  • NHibernate中一对一关联的延迟加载

    2009-8-17 12:09:00

    摘要: 这篇文章谈论的其实只是一个小技巧,而且甚至于这个是由于我对NHibernate不够了解而造成的。因此,如果您有更好的做法也请不吝指出。这个问题也就是“如何实现NHibernate中一对一映射

  • 设计友好的错误信息页面

    2009-4-14 19:51:00

    摘要: 大多数用户看到”该页无法显示,”服务器内部错误等默认错误提示信息会立马关闭浏览器窗口,我们为什么不能自定义一下呢?让用户从错误信息中得到真正的帮助? 阅读全文 ------------

  • SharePoint2007的权限设置

    2007-1-22 11:48:00

    杜伟在OTEC上面发布了一篇不得不看的文章,介绍sharepoint2007的权限系统: http://www.msotec.net/Forums/ShowThread.aspx?PostI

  • New ASP.NET AJAX Control Toolkit Release

    2007-6-8 23:36:00

    Yesterdaythe ASP.NET AJAX Control Toolkit team released an updated version . You can download it f

  • 成都(10月24日时代广场)Windows 7社区发布活动

    2009-10-15 2:57:00

    摘要: 报名地址:https://spreadsheets.google.com/viewform?hl=en&formkey=dEVwUnlzYktDS2h3RzlpNWpNbzFYZWc

  • 两个关于.NET读取EXCEL文件的问题

    2009-6-6 12:33:00

    今天有个同事问我个问题,他在用C#“Microsoft.Jet.OLEDB.4.0”读取EXCEL文件的时候,发现了一个问题,是这样的,他读出来的EXCEL数据在DATAGRID中显示的时候,只有文

  • C#中用鼠标移动页面功能的实现

    2009-6-1 22:29:00

    项目中需要实现以下功能: 打印预览控件中,可以用鼠标拖动页面,以查看超出显示范围之外的部分内容。 该功能本来可以通过拉动水平和垂直滚动条来实现,但实际使用中,用户更趋向于直接用鼠标拖动页面来