如果您没有特殊需求,我认为重要的是要知道您可以将 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 作为容器获得相同的结果。