ActiveReports for .NET 7.0J を WPF で使うチュートリアル

GrapeCity さんの ActiveReports for .NET 7.0JWPF で使うためネットで資料を探してみたら見つからなかったので、さくっとチュートリアルっぽいものを書いてみようと思います。

グレープシティ ActiveReports for .NET 7.0J スタンダード 1開発LP

グレープシティ ActiveReports for .NET 7.0J スタンダード 1開発LP


今回のチュートリアルでは、レポートのデータソースに DataTable でなく ObserbableCollection を使用するため、LivetWPFアプリケーションを作成し、ViewModel のプロパティを帳票に出力する方向で行います。

ちなみに今回のエントリでは C# で開発し、次回の記事では VB 編を予定してます。本チュートリアルでの開発環境は以下のとおりです。

Visual Studio 2013
ActiveReports for .NET 7.0J
Livet 1.2.0


Visual Studio 2013 は無償版の Visual Studio Community 2013 が公開されました。まだ使ってない方はこの機会にインストールしてみてはいかがでしょうか?

また ActiveReports for .NET のトライアル版は、以下のページから入手可能です。

ActiveReports for .NETトライアル版

Livet は以下のページからダウンロードできます。チュートリアルを実践する前にインストールしておいてください。

Livet - WPF4/4.5 MVVM インフラストラクチャ



Livet アプリケーション プロジェクトを作成する

Visual Studio を起動し「新しいプロジェクト」を起動。「Livet WPF4.5 MVVM アプリケーション」を選択したら、プロジェクト名を「WPFReport」に変更し「OK」ボタンをクリックします。プロジェクトが生成されたら XAMLデザイナを開いた際エラーが出ないよう、いったんビルドしておきましょう。



次にモデルの作成です。今回は単純なチュートリアルなので、Person クラスを Models フォルダに追加します。ソリューションエクスプローラーで Models フォルダを選択し右クリック、「新しい項目の追加」で「クラス」を選択、「Person.cs」と名前を変えて追加します。クラスは以下のように実装します。


お次は Person オブジェクトのコレクションを生成するファクトリクラスを作成します。上記手順で「Persons」クラスを Models フォルダに追加し、以下のように実装します。


お次は ViewModel です。実はコレクションプロパティを実装しても、ActiveReports とバインドできません。ただし将来のバージョンではバインドできるようになるかもしれないので、取り敢えず用意しておきます。


レポートをデザイナで作成する

ここまでで、ViewModel と Model の用意はできました。お次は帳票のデザインです。「新しい項目の追加」で「ActiveReports 7.0J セクションレポート(コード)」を選択し、ファイル名を「PersonsReport.cs」に変えて「追加」ボタンをクリックします。


プロジェクトにレポートが追加されたら、ソリューションエクスプローラで「PersonsReport.cs」を選択しデザイナで開きます。


ツールボックスの「ActiveReports 7 セクション」から、ヘッダーに Label を四つと Line を一つ、Detail にテキストボックスを四つと Line を一つ、ドロップして配置します。


各オブジェクトのプロパティは以下になります。まずページヘッダーとデティールの高さを設定します。

  オブジェクト     プロパティ(Height)  
pageHeader 0.6
detail 0.6


PageHeader 内に配置するオブジェクトとプロパティの詳細です。

プロパティ
オブジェクト X1 X2 Y1 Y2 LineStyle
line1 0 15.24 0.6 0.6 Solid
プロパティ
オブジェクト Text Location.X Location.Y Size.Width Size.Hight
Label1 名前 0 0 3.5 0.5
Label2 部署 3.5 0 2.8 0.5
Label3 住所 6.3 0 4.8 0.5
Label4 電話番号 11.1 0 2.8 0.5


Detail 内に配置するオブジェクトとプロパティの詳細です。

プロパティ
オブジェクト X1 X2 Y1 Y2 LineStyle
line2 0 15.24 0.55 0.55 Dot
プロパティ
オブジェクト DataField Location.X Location.Y Size.Width Size.Hight
textBox1 Name 0 0.1 3.5 0.5
textBox2 Post 3.5 0.1 2.8 0.5
textBox3 Address 6.3 0.1 4.8 0.5
textBox4 Telephone 11.1 0.1 2.8 0.5

ビューを作成する

最後はビューを作成します。MainWindow.xaml をデザイナで開き、ツールボックスから Viewer をドロップしてください。すると以下のように表示されます。


あれれ?(^^; うちの環境だけかもしれませんが、思わぬ警告ダイアログがでました。しかもXAMLデザイナを再起動しても WPF.Viewer のアセンブリが参照に追加されてないしー(汗
仕方ないので、手動で 「GrapeCity ActiveReports WPF Viewer」を参照設定に追加します。


これでツールボックスからドラッグドロップして Viewer を貼り付けられるようになりました。


Viewer を選択して右クリックし「レイアウト」→「すべてリセット」を実行し、画面全体にビューアーが表示されるようにします。そして Viewer に名前をつけます。あと Window はプレビュー画面になるので、起動時に最大化で表示されるよう WindowStateプロパティを Maximized に設定しときましょう。


上の方でも書きましたが、ActiveReports の WPF ビューアーは ViewModel とバインドできません。またレポートを生成してビューアーに設定する必要があるため、コードビハインドで実装します。MainWindow のコンストラクタ内でレポートのインスタンスを生成し、Viewer の LoadDocumentメソッドのパラメータに渡します。Forms では Document プロパティに設定してたのですが、この辺りのインターフェイスが変更されたようですね。
あと注意事項ですが、通常 UIElement を継承した WPFコントロールは解放を考慮する必要がなく Dispose メソッドも用意されてませんが、WPF 用の Viewer は Dispose メソッドが提供されており、画面終了時に Dispose メソッドをコールする必要があります。本サンプルでは Window.Closed イベント内で、レポートとともに Dispose を実行してリソースを解放しています。


実行すると、こうなります。


今回のチュートリアルではあえて ViewModel を用意しましたが、実際の開発でも ViewModel のコレクションプロパティを帳票で印刷するケースが多いと予想されます。現状は ViewModel のプロパティとのバインドはできませんが、コードビハインドのわずかな行数で十分実装可能なのが確認できたと思います。Forms から WPF への移行の参考になれば幸いです。


#2014/11/21:レポートとビューアーの Dispose 処理を追加。