重复 RDLC ReportViewer 子报表
Posted
技术标签:
【中文标题】重复 RDLC ReportViewer 子报表【英文标题】:Repeat a RDLC ReportViewer subreport 【发布时间】:2019-02-24 22:09:02 【问题描述】:我对 RDLC 很陌生,所以如果我遗漏了一些明显的东西,请原谅我。
我有一些数据需要重复,基于链接到主报告的 1:Many 数据集。它不能以表格方式显示,因为客户希望它以特定方式布局,因此无法使用 Tablix 控件。在这个主报告中,我有许多基于 1:1 数据集的子报告,所有这些都很酷。我为这个新数据集创建了一个子报表并将其添加到主 RDLC 报表中。一切正常,但它只包括数据集的第一条记录。
是否可以为数据集中的每条记录重复此子报表?我认为让我感到困惑的是主 RDLC 没有专门加载各个子报表的代码,所以我看不到任何明显的地方可以包含循环或任何东西。
【问题讨论】:
应该有SubreportProcessing 事件,该事件会针对主报告中的每个子报告实例触发。如果一个报表包含来自同一报表定义的多个子报表实例,则会为每个实例触发此事件。 如何使用该信息将子报表重复 n 次,其中 n 是返回到填充它的数据集的记录数? 【参考方案1】:如果您没有特殊需求,我认为重要的是要知道您可以将 Rectangle
放入 Tablix
单元格中,然后将其用作TextBox
、Line
、@ 等简单控件的容器987654336@等随你所想。
如果您仍需要使用子报表,您可以在Tablix
单元格中放置一个SubReport
,并解决处理子报表时发生的LocalReport.SubreportProcessing
事件中的任何问题。
如果您有很多记录,您可以使用单个Dataset
并在SubreportProcessing
事件中过滤它,使用您已经在Designer Mode
中设置的子报告Parameters
。
Private Sub SubreportProcessingHandler(sender As Object, e As SubreportProcessingEventArgs)
Dim dvFiltered As New DataView(Me.YourDataSet.Tables(0))
dvFiltered.RowFilter = "Parameter1 = " & CInt(e.Parameters.Item("yourParameter1").Values(0)) & " AND " _
& "Parameter2 = '" & CStr(e.Parameters.Item("yourParameter2").Values(0)) & "'"
e.DataSources.Add(New ReportDataSource("YourDataSourceName", dvFiltered.ToTable("YourDataSourceName")))
End Sub
例如,使用包含主数据和明细数据的DataSet
,您可以构建按IdMaster
分组的主报表,并将子报表放在明细部分。
这是子报表:请注意DataSet
与主报表相同,但我们还需要 2 个Parameters
(IdMaster
和 IdRow
)来显示正确的数据。
在主报告中,您需要将子报告Parameters
链接到DataSet
的实际值。
然后,最重要的部分:SubreportProcessingHandler
事件。主报表中子报表的每个实例都会触发此事件,因此如果您有 100 行/100 个子报表,则此事件会触发 100 次:每次您需要指定要显示的数据时,因此您必须过滤DataSet
使用上一步中定义的 2 个Parameters
(IdMaster
和 IdRow
)并填充来自主报告的值。
Private Sub SubreportProcessingHandler(sender As Object, e As SubreportProcessingEventArgs)
Dim dvTest As New DataView(Me.dsTest.Tables(0))
dvTest.RowFilter = "IdMaster = " & CInt(e.Parameters.Item("parIdMaster").Values(0)) & " AND " _
& "IdRow = " & CInt(e.Parameters.Item("parIdRow").Values(0))
e.DataSources.Add(New ReportDataSource("DataSet_TEST", dvTest.ToTable("DataSet_TEST")))
End Sub
这是结果:
正如我在答案开头所说,如果您没有特殊需求,可以使用Rectangle
而不是SubReport
。关于这个例子,您可以使用绿色的Rectangle
作为容器获得相同的结果。
【讨论】:
我将子报表放在 Tablix 中(我什至不知道您可以这样做...),但它仍然只显示第一条记录中的数据。 我们已经接近了,只是在重复所有数据时遇到了问题。我认为我们需要集成您的过滤器,希望我能在一天结束前检查一下。 作为记录,以防其他人遇到此问题,出于我的目的,我只是无法让它在子报表中工作。也许是因为在我的情况下,它实际上是一个子子报表。但是,将一个 Rectangle 对象添加到 Tablix 并以我需要的方式在其中布置我的所有字段,以使它们完美运行。谢谢!!以上是关于重复 RDLC ReportViewer 子报表的主要内容,如果未能解决你的问题,请参考以下文章