Повторите вложенный отчет Rdlc ReportViewer
Я действительно Новичок в RDLC, поэтому, пожалуйста, простите меня, если я пропустил что-то очевидное.
У меня есть некоторые данные, которые нужно повторить, основываясь на наборе данных 1:Many, который связан с основным отчетом. Это не то, что можно отобразить в табличной форме, потому что клиенты хотят, чтобы он был выложен определенным образом, поэтому использование элемента управления Tablix отсутствует. У меня есть несколько вложенных отчетов на основе наборов данных 1:1 в этом основном отчете, и с ними все в порядке. Я создал вложенный отчет для этого нового набора данных и добавлен в основной отчет RDLC. Все работает нормально, но включает только первую запись набора данных.
можно ли повторить этот вложенный отчет для каждой записи в наборе данных? Я думаю, что меня смущает, что у основного RDLC нет кода, который специально загружает отдельные вложенные отчеты, поэтому я не вижу очевидного места, где я мог бы включить цикл или что-то еще.
1 ответов
если у вас нет особых потребностей, я думаю, важно знать, что вы можете поставить Rectangle
на Tablix
ячейка, а затем использовать его в качестве контейнера для простых элементов управления, как TextBox
, Line
, Image
, etc. валяй, как хочешь.
если вам все еще нужно использовать вложенный отчет вы могли бы поставить 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 вложенных отчетов это событие triggedered 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
как контейнер.