modest violet

読者です 読者をやめる 読者になる 読者になる

modest violet

開発者としてのあれこれや、日々の雑記など

your future hasn't written yet. no one's has.
by Emmett Lathrop "Doc" Brown

Active Reportの用紙サイズが戻ってしまう現象で四苦八苦したので回避策

GrapeCity社のActive Reportで久々に嵌まったので備忘録。

印刷ダイアログで指定した用紙サイズによって、動的にレイアウトを変更したかったので、レポートをRunする前に、印刷ダイアログで用紙サイズ等を取得する処理を書きました。

※ざっくり書いていますが、実際のコードはキチンとしています。。。



頭の中では動いているのだが

どうも、最後付近にある mainReport.Run() が動くと、用紙サイズがデフォルトに戻ってしまっているようなのです。

' プレビュー用のActiveReport Viewを用意したフォーム
Dim newForm = New ActiveReportsView

' メインとなるレポート
Dim mainReport = New arMainReport

' レポートをプレビューに受け渡し
newForm.Viewer.Document = mainReport.Document

' 印刷ダイアログの準備
Dim pd As New PrintDialog

' レポートのドキュメント情報を渡す
pd.Document = newForm.Viewer.Document

' 印刷ダイアログ表示
' !!!ここで用紙サイズを変える!!!
If pd.ShowDialog <> Windows.Forms.DialogResult.OK Then Return 

' 印刷項目のデータをレポートに渡す
mainReport.HogeDatas = hogeDatas

' レポート実行
' !!!ここで印刷ダイアログで指定した用紙サイズ等の情報がリセットされる!!
mainReport.Run()  

' プレビュー表示
newForm.ShowDialog(Me)

きっと原因は単純明快な理由なんだろう

おそらくはレポートをRunにしたタイミングで、メインとなるレポートの初期値が反映されているっぽい。
色々な情報を漁ってはみるものの、なかなか該当項目にはヒットせず。

時間的な制約もあったので、メインとなるレポートを準備して、後にレポートを追加する方法に変更しました。

Using mainReport As New arMainReport

    Using workReport As New arMainReport

        workReport.Run()

        ' 作成済みレポートをメインに統合
        For i As Integer = 0 To workReport.Document.Pages.Count - 1
            mainReport.Document.Pages.Add(workReport.Document.Pages(i))
        Next

    End Using

    ' レポートをプレビューに受け渡し
    newForm.Viewer.Document = mainReport.Document

End Using

まとめ

ActiveReportでレポートを作成する場合はメインレポートに作業レポートをAddしていく形が一番やりやすい。
今後似たような案件があれば、この方法で統一。