Повторите запись отчета RDLC ReportViewer

Я действительно новичок в RDLC, поэтому, пожалуйста, простите меня, если я пропущу что-то очевидное.

У меня есть некоторые данные, которые необходимо повторить, на основе набора данных 1: Многие, которые связаны с основным отчетом. Это не то, что может отображаться в табличном виде, потому что клиенты хотят, чтобы оно было выложено определенным образом, поэтому использование элемента управления Tablix отсутствует. В этом основном отчете есть несколько подзаголовков, основанных на наборах данных 1:1, и с ними все в порядке. Я создал подчиненный отчет для этого нового набора данных и добавил его в основной отчет RDLC. Все работает нормально, но включает только первую запись набора данных.

Можно ли повторить этот отчет для каждой записи в наборе данных? Я думаю, что что-то меня смущает, поскольку основной RDLC не имеет кода, который специально загружает отдельные подзаголовки, поэтому я не вижу ничего очевидного, где бы я мог включить цикл или что-то еще.

Ответ 1

Если у вас нет особых потребностей, я думаю, важно знать, что вы можете поместить Rectangle в ячейку Tablix а затем использовать его в качестве контейнера для простых элементов управления, поскольку TextBox, Line, Image и т.д. Выступили, как вы хотите.

Если вам все еще нужно использовать подотчет можно поставить SubReport в Tablix клетки и решить любую проблему в LocalReport.SubreportProcessing событие, которое происходит, когда подотчет обрабатывается.

Если у вас много записей, вы можете использовать один Dataset и отфильтровать его в событии SubreportProcessing, используя Parameters Subreport, которые вы уже установили в 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 и поместить подраздел в подробный раздел.

main report

Это подзаголовок: обратите внимание, что DataSet совпадает с основным отчетом, но нам также нужны 2 Parameters (IdMaster и IdRow) для отображения правильных данных.

sub report

В основном отчете вам необходимо связать Parameters подчиненного отчета с фактическими значениями DataSet.

sub report parameter

Затем, самая важная часть: событие 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

Это результат:

result

Как я уже сказал в начале ответа, если у вас нет особых потребностей, вы можете использовать Rectangle вместо SubReport. Что касается этого примера, вы можете получить тот же результат, используя зеленый Rectangle качестве контейнера.

rectangle