重复 RDLC ReportViewer 子报表

Repeat a RDLC ReportViewer subreport

我是 RDLC 的新手,所以如果我遗漏了一些明显的东西,请原谅我。

我有一些数据需要重复,基于链接到主报告的 1:Many 数据集。它不能以表格方式显示,因为客户希望以特定方式对其进行布局,因此不再使用 Tablix 控件。在这个主报告中,我有许多基于 1:1 数据集的子报告,这些都很好。我为这个新数据集创建了一个子报表,并将其添加到主 RDLC 报表中。一切正常,但它只包含数据集的第一条记录。

是否可以为数据集中的每条记录重复此子报表?我认为让我感到困惑的是主要 RDLC 没有专门加载各个子报表的代码,所以我看不到任何明显的地方可以包含循环或任何东西。

如果您没有特殊需求,我认为重要的是要知道您可以在 Tablix 单元格中放置一个 Rectangle,然后将其用作简单控件的容器,如 [=14] =]、LineImage 等,随心所欲。

如果您仍然需要使用子报表,您可以在 Tablix 单元格中放置一个 SubReport 并解决处理子报表时发生的 LocalReport.SubreportProcessing 事件中的任何问题。

如果您有很多记录,您可以使用单个 Dataset 并在 SubreportProcessing 事件中过滤它,使用您已经在 [=23] 中设置的子报告 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 ParametersIdMasterIdRow)才能显示正确的数据。

在主报表中,您需要 link 子报表 ParametersDataSet 的实际值。

然后,最重要的部分:SubreportProcessingHandler事件。主报表中子报表的每个实例都会触发此事件,因此如果您有 100 行/100 个子报表,此事件将被触发 100 次:每次您需要指定要显示的数据,因此您必须过滤DataSet 使用上一步中定义的 2 ParametersIdMasterIdRow)并填充来自主报告的值。

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 作为容器获得相同的结果。