[.NET] RDLC循环处理数据
当我们在使用RDLC开发报表的时候,如果数据源内容如下。
1 2 3 4 5 6 7 | 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处理过一次。
1 | =Sum(code.PushString(Fields!Name.Value, Fields!Age.Value), "UserDataSet") |
接着看code.PushString这个RDLC自定义函式的内部,使用了一个Static的字符串变量,来记录每一笔数据处理之后的结果。到这边开发人员应该可以理解,这样的方式就是在跑循环处理数据。
1 2 3 4 5 6 | 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回传。
1 2 3 | Public Shared Function PopString() As String Return _foreachResult End Function |
并且将原本的表达式改写成为:
1 | =IIF(Sum(code.PushString(Fields!Name.Value, Fields!Age.Value), "UserDataSet") <> 0, "", code.PopString()) |
编译并且执行之后,就可以看到在RDLC的文本框里,已经正确的显示了客户要求的数据格式。
范例程序 : RdlcForeachDataSample点此下载。
(为了方便说明思路,简化了设计。开发人员应依照实际情景建立实作。)
期許自己~
能以更簡潔的文字與程式碼,傳達出程式設計背後的精神。
真正做到「以形寫神」的境界。
分类:
.NET
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?