イベントでのコードによる処理 1
フィールド式だけでもいろいろな編集ができますが、複雑な条件判断を記述するのは現実的ではありません。
セクションレポートにはさまざまなイベントが用意されており、そのイベントにコードを記述することで、レポートの内容を変更できます。
セクションレポートのイベント
Windowsアプリケーションのプログラミングにはイベントを使用します。例えばフォーム全体の処理はForm.Loadイベントで処理するのが一般的です。セクションレポートのイベントもこれと似た感じのものです。
イベントは、レポートの実行と、データの読み込み、セクションの描画に従って発生します。
セクションレポートのイベントには、以下のものがあります。
レポート全体のイベント
ReportStartイベント
レポートを実行した時に、最初に1回だけ発生するイベントです。用紙サイズやデータソースの設定など、レポート全体にかかわる設定はここで行います。
DataInitializeイベント/FetchDataイベント
セクションレポートで使うデータの「フィールド」は、レポートのデータソースを元に自動的に生成されます。DataInitializeイベントは、自動的に生成されるフィールドの他に任意のフィールドを追加する際に使用します。ReportStartイベントの後に1回だけ発生します。
FetchDataイベントは、データソースからデータ行を1行読み込むたびに呼び出されます。ここでフィールドに値を設定することもできます。
DataInitializeイベントとFetchDataイベントを使って、データソースなしでセクションレポートを動作させることができます。この使用法は「アンバウンドレポート」と呼ばれます(詳細は後述します)。
ReportEndイベント
レポート生成処理の最後に1回だけ発生します。レポート処理中に使用した任意のオブジェクトを閉じるなど、主に終了処理に使用します。なお、この段階ではレポートのページがすべて生成されています。従って、このイベントでは、PageクラスのDraw系メソッドを使って、任意のページに文字や線などを直接描画することも可能です。
PageStartイベント/PageEndイベント
各ページの生成の最初と最後に発生するイベントです。
各セクションのイベント
Detailセクション、ページヘッダ、ページフッタ、グループヘッダ、グループフッタなどの各セクションにもイベントが用意されています。これらのイベントは、セクションが1回描画されるごとに、基本的にそれぞれ1回ずつ発生します。
Formatイベント
セクションの生成後に呼び出されるイベントです。セクションや、個々のコントロールの内容を変更する場合、通常はこのイベントを使います。
BeforePrintイベント
セクションの生成後、描画の直前に呼び出されるイベントです。Formatイベントと同様に使用することができます。
FormatイベントとBeforePrintイベントは同じように使われることもありますが、いくつか注意すべき違いがあります。
- セクション自体の高さを変更できるのはFormatイベントだけで、BeforePrintイベントではできない。
- CanGrow/CanShrinkプロパティによるセクション・コントロールの自動伸縮機能は、Formatイベントの後、BeforePrintイベントの前に実行される。このためBeforePrintイベントでコントロールに出力する内容を変更しても自動伸縮は実行されない。
- SummaryFuncプロパティなどによる集計結果は、BeforePrintイベントの段階でないと取得できない。
AfterPrintイベント
セクションの生成が終わった後に呼び出されるイベントです。
イベントを追加する方法
イベントを追加する方法を説明します。
デザイン画面で、イベントを使用したいセクション上でダブルクリックすると、.vbや.csのコードファイルに、Formatイベントのスタブが自動生成されます。
生成されるFormatイベントのスタブ
Private Sub Detail_Format(sender As System.Object, e As System.EventArgs) Handles Detail.Format End Sub
private void detail_Format(object sender, EventArgs e) { }
生成されるイベントハンドラ名は、イベントのセンダ(この場合はセクション)の名前と、イベント名をアンダーラインでつないだものになります。Windowsアプリケーションでフォームやコントロールにイベントを追加する場合と同様です。
セクションを選択していない状態でデザイン画面をダブルクリックすると、ReportStartイベントのスタブが生成されます。
Format、ReportStart以外のイベントを生成したい時には、プロパティウィンドウのイベント画面からイベントを追加します。
Visual Basic .NETでは、引数の後にあるHandles句によってイベントハンドラの登録が行われます。C#では.Designer.csファイルの中にイベントハンドラを登録するコードが追加されます。このためC#の場合は、サンプルコードをそのままコードに記述してもイベントとして働きません。注意してください。