Это работает, но это точно привередливый.
Первое, что я рекомендую, - это разработать ваши отчеты как .rdl. Гораздо проще проверить отчеты таким образом. Можно также настроить параметры подотчета и проверить их как rdl, убедившись, что каждый параметр подотчета также определен как параметр родительского отчета. Как только вы получите отчеты, включая подотчеты, работающие таким образом, вы можете переименовать .rdl в rdlc и добавить файлы rdlc в ваш проект ReportViewer. Никаких дальнейших изменений не требуется. Используйте имена источников данных rdl в качестве имен источников данных в своем коде для предоставления данных для отчета в обработчике событий SubreportProcessing.
Вы не присваиваете значения переданному параметру. Подотчет будет использовать их как есть. (Похоже, что пропущенный шаг - это добавление параметров в родительский отчет, а также вложенный отчет, как упомянуто выше.) Вы можете оценить параметры и использовать их в качестве параметров запроса для получения источника данных, который вы добавите.
Вы должны подумать о источнике данных, например о нераскрытом измерении для подотчета. Вам придется покопаться во время отладки в обработчике событий, чтобы понять, что я имею в виду. Некоторые из значений в вашем приложении будут легко доступны, другие, которые вы легко используете в другом месте, будут выбрасывать объект не найденные исключения. Например, я создаю набор данных в экземпляре класса, созданного в главной форме моих приложений. Я использую набор данных во всем приложении. В обработчике событий SubreportProcessing я не могу использовать общий набор данных, поэтому я должен создать новый экземпляр таблицы, который мне нужен для отчета, и заполнить его. В основном отчете я смогу получить доступ к общему набору данных. Есть и другие ограничения, как это. Просто пробирайся.
Вот обработчик события SubreportProcessing из работающего приложения VB.NET ReportViewer. Показаны несколько разных способов получения источника данных для подотчета. subreport1 создает одну строку данных из бизнес-объектов приложения, subreport2 предоставляет данные, которые требуются отчету без параметра, subreport3 является лежащим subreport2, но оценивает один из параметров, переданных в подотчет, для использования в значении даты, требуемом запросом, который создает ReportDataSource.
Public Sub SubreportProcessingEventHandler(ByVal sender As Object, _
ByVal e As SubreportProcessingEventArgs)
Select Case e.ReportPath
Case "subreport1"
Dim tbl As DataTable = New DataTable("TableName")
Dim Status As DataColumn = New DataColumn
Status.DataType = System.Type.GetType("System.String")
Status.ColumnName = "Status"
tbl.Columns.Add(Status)
Dim Account As DataColumn = New DataColumn
Account.DataType = System.Type.GetType("System.String")
Account.ColumnName = "Account"
tbl.Columns.Add(Account)
Dim rw As DataRow = tbl.NewRow()
rw("Status") = core.GetStatus
rw("Account") = core.Account
tbl.Rows.Add(rw)
e.DataSources.Add(New ReportDataSource("ReportDatasourceName", tbl))
Case "subreport2"
core.DAL.cnStr = My.Settings.cnStr
core.DAL.LoadSchedule()
e.DataSources.Add(New ReportDataSource("ScheduledTasks", _
My.Forms.Mother.DAL.dsSQLCfg.tSchedule))
Case "subreport3"
core.DAL.cnStr = My.Settings.cnStr
Dim dt As DataTable = core.DAL.GetNodesForDateRange(DateAdd("d", _
-1 * CInt(e.Parameters("NumberOfDays").Values(0)), _
Today), _
Now)
e.DataSources.Add(New ReportDataSource("Summary", dt))
End Select
End Sub