我真的是RDLC的新手,所以如果我缺少明显的内容,请原谅我。
基于链接到主报表的1:许多数据集,我有一些数据需要重复。它不能以表格形式显示,因为客户希望以特定的方式进行布局,因此可以使用Tablix控件。在此主报表中,我有许多基于1:1数据集的子报表,而这些子报表都很不错。我为此新数据集创建了一个子报表,并将其添加到主RDLC报告中。一切正常,但只包含数据集的第一条记录。
是否可以为数据集中的每个记录重复此子报表?我认为让我感到困惑的是主RDLC没有专门加载各个子报表的代码,因此我看不到任何可以包含循环或任何内容的地方。
答案 0 :(得分:6)
如果您没有特殊需要,我想知道可以将Rectangle
放在Tablix
单元格中,然后将其用作TextBox
的简单控件的容器很重要,Line
,Image
等根据需要进行布局。
如果仍然需要使用子报表,可以将SubReport
放在Tablix
单元中,并解决在处理子报表时发生的LocalReport.SubreportProcessing
事件中的任何问题。
如果您有很多记录,则可以使用单个Dataset
并使用SubreportProcessing
中已设置的子报告Parameters
在Designer Mode
事件中对其进行过滤
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
作为容器来获得相同的结果。