好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

RDLC循环处理数据

[.NET] RDLC循环处理数据

当我们在使用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 .Empty

 

Public   Shared   Function   PushString(userName As   String , userAge As   String ) As   Integer

     _foreachResult += userName & "("   & userAge & "), "

     Return   0

End   Function

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

?

Public   Shared   Function   PopString() As   String

     Return   _foreachResult

End   Function

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

?

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

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

范例程序 :  RdlcForeachDataSample点此下载。

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

期許自己~
能以更簡潔的文字與程式碼,傳達出程式設計背後的精神。
真正做到「以形寫神」的境界。

分类:  .NET

作者: Leo_wl

    

出处: http://www.cnblogs.com/Leo_wl/

    

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

版权信息

查看更多关于RDLC循环处理数据的详细内容...

  阅读:46次