それは機能しますが、確かに厄介です。
まず、レポートを .rdl として作成することをお勧めします。この方法でレポートをテストする方がはるかに簡単です。また、サブレポートのパラメーターを設定して rdl としてテストし、サブレポートの各パラメーターが親レポートのパラメーターとしても定義されていることを確認することもできます。サブレポートを含むレポートを取得したら、.rdl の名前を rdlc に変更し、rdlc ファイルを ReportViewer プロジェクトに追加できます。これ以上の変更は必要ありません。コード内のデータ ソース名として rdl データソースの名前を使用して、SubreportProcessing イベント ハンドラーでレポートにデータを提供します。
渡されたパラメーターに値を割り当てません。サブレポートはそれらをそのまま使用します。(欠落しているステップは、上記のように親レポートとサブレポートにパラメーターを追加しているようです。)パラメーターを評価し、それらをクエリパラメーターとして使用して、追加するデータソースを取得できます。サブレポートの未発見のディメンションにあるようなデータソースについて考える必要があります。イベント ハンドラーでデバッグしている間、私の言いたいことを確認する必要があります。アプリケーションの値の中にはすぐに使用できるものもあれば、他の場所で簡単に使用できるものもあり、object not found 例外がスローされます。たとえば、アプリケーションのメイン フォームで作成したクラスのインスタンスにデータセットを作成します。アプリケーション全体でデータセットを使用します。SubreportProcessing イベント ハンドラーでは、共通のデータセットを使用できません。そのため、レポートに必要なテーブルの新しいインスタンスを作成して入力する必要があります。メイン レポートでは、共通のデータセットにアクセスできます。このような他の制限があります。ただ通り抜ける必要があります。
以下は、動作中の VB.NET ReportViewer アプリケーションの SubreportProcessing イベント ハンドラーです。サブレポートのデータソースを取得するいくつかの異なる方法を示します。subreport1 はアプリケーション ビジネス オブジェクトから 1 行のデータ テーブルを構築し、subreport2 はレポートが必要とするデータをパラメーターなしで提供します。subreport3 は subreport2 と同じですが、ReportDataSource を作成するクエリで必要な日付値で使用するためにサブレポートに渡されたパラメーターの 1 つを評価します。
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