Это действительно работает, но это, конечно, привередливо.
Первое, что я рекомендую, это разрабатывать ваши отчеты как .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
person
Community
schedule
25.01.2009