[C#,VS2010]CrystalReportsで自作DataSetを元に帳票を印刷する。



前回はVisualStudio2010の環境で、C#を使用してCrystalReportsの帳票印刷のセットアップと、簡単な帳票発行の動作確認を行いました。
VS2010でCrystalReportsを使用して、帳票を作成する
今回は、プログラムから指定したデータ郡を複数レコード、印刷してみます。


帳票プログラムの場合、複数レコードの印刷は、データベースからデータを取得して、その内容を印刷する事がよくあるパターンです。C#ではDBから取得したデータは、通常DataSetクラスを使用して管理します。

いきなりDBを使用したパターンのプログラムを解説すると考慮すべき点(=説明する内容)が多くなってしまう為、今回の記事ではDBを使用せず、自作のデータセットを元に複数行の明細を持つ帳票を作成し、基本の流れをつかむ事とします。

画面の定義

前回同様、今回もボタンを1つとCrystalReportDocumentコントロールを1つ配置します。
CrystalReportDocumentは、レポーティングのカテゴリ内に有ります。
レポーティングがない場合は、CrystalReportのセットアップができていないので、前回の記事を参考にセットアップを行ってください。



データセットの定義

まずはデータセットのフィールド定義を行います。
ここで定義したフィールド名は、プログラムから帳票に渡すデータのキー名称となります

メニューより、”プロジェクト→新しい項目の追加”を選択します。


“データ→データセット”を選択します。



画面にxsdファイルが表示されます。
データセットの定義は、このxsdファイルで行って行きます。



表示されたxsdファイルを右クリックし、追加->DataTableを選択します。



DataTable1が表示されるので、選択してF2キーを押し、分かりやすい名前に変更します。
今回は帳票用のテストテーブル定義なので”RepTestTable”にしました。
ここで決めた名称は、帳票のレイアウト定義時に使用します。

   ↓



次に、このテーブルに対してフィールド定義を行っていきます。
Tableを右クリックして、追加->列を選択します。


キー名を指定します。
今回はキー名をidにしました。


プロパティを見ると、データ型はデフォルト値としてStringになっています。



同様に、name,price列を追加します。


price列(金額)は数値なので、Int32型に変更しておきます。


以上で、データセットの定義は完了です。
ここで定義した情報はCrystalReportsの帳票レイアウト作成や、プログラム中のデータをセットする時に使用します。


帳票レイアウトの作成


前回同様、メニューより”プロジェクト→新しい項目の追加”をクリックし、”Reporting→Crystal レポート”を選択します。



“レポートウィザードを使用”を選択します。


データの選択画面が表示されます。
ここで、プロジェクトデータ->ADO.NETデータセットを選択すると、先ほど作成したデータセットが表示されます。


項目を選択後、”>”ボタンをクリックし、選択したテーブルに移動させます。
移動させたら、画面下の”次へ”をクリックしてください。


選択可能なフィールドを全て選択し、表示するフィールドに移します。


グループ化は、小計などを表示する際に使用します。
今回はグループ化を行わないので、そのまま”次へ”をクリックします。
[画面キャプチャ取り忘れました…]

レコードの選択は、データセットの中から特定の条件に一致するものだけを印字させるためのフィルタ機能です。
今回は印字データをプログラムから明示的にセットするので、これもそのまま”次へ”をクリックします。
[画面キャプチャ取り忘れました…]

スタイルは標準を選択して終了をクリックします。


完了を押すと、レポートのレイアウト画面が表示されます。
既に、データセットのフィールドが画面に配置されています。


ページヘッダ側の”id”を選択しプロパティを確認すると、ITextObject型である事が分かります。
ITextObjectは、いわゆる固定の文字列になります。




同様に、明細側の”id”はIFieldObject型になっています。
ITextObjectは、いわゆる変数部となり、実際の値はプログラム側からセットします。




項目の印字位置を移動させたい場合は、明細側をドラッグするとタイトルの位置も同時に移動してくれます。逆に、タイトル側をドラッグしてしまうと、明細側は移動してくれないので注意が必要です。


前回と同様、固定文字のテキストを追加する事もできます。
今回はページヘッダに帳票タイトルとして、”商品マスタ”の文字を追加しました。


最初に配置されたヘッダのタイトル文字を変えたい場合は、項目をダブルクリックすれば編集できます。


いろいろ微調整した結果、今回は以下のレイアウトを作成しました。



レイアウトを作成し終わったら前回と同様、CrystalReportDocumentのFileNameに、rptファイルを指定してください。



印字データのセット処理

次は、先ほど作成した帳票にデータを流し込む処理を記述します。

ボタンのイベントハンドラに以下のコードを追加してください。

private void button1_Click( object sender, EventArgs e ) {
    // レコード定義を行う
    DataTable table = new DataTable();
    table.Columns.Add("id",    Type.GetType("System.String"));
    table.Columns.Add("name",  Type.GetType("System.String"));
    table.Columns.Add("price", Type.GetType("System.Int32"));
 
    // 印字データを追加
    DataRow row;
    row = table.NewRow();
    row["id"]    = "iten_no1";
    row["name"]  = "りんご";
    row["price"] = 200;
    table.Rows.Add(row);
 
    row = table.NewRow();
    row["id"]    = "iten_no2";
    row["name"]  = "みかん";
    row["price"] = 220;
    table.Rows.Add(row);
 
    row = table.NewRow();
    row["id"]    = "iten_no3";
    row["name"]  = "ばなな";
    row["price"] = 40;
    table.Rows.Add(row);
 
    // 印字データをセット
    crystalReport1.SetDataSource( table );
    crystalReport1.Refresh();
 
    // プリンタに印刷
    crystalReport1.PrintToPrinter( 0, false, 0, 0 );
}



何を行っているか確認するため、コードを順に読んでいきます。


まずはテーブル定義の作成です。
table.Columns.Add()の引数は、xsdでデータセットのフィールド定義を行った時と同じものを指定する必要があります。

    // レコード定義を行う
    DataTable table = new DataTable();
    table.Columns.Add("id",    Type.GetType("System.String"));
    table.Columns.Add("name",  Type.GetType("System.String"));
    table.Columns.Add("price", Type.GetType("System.Int32"));




次に帳票に印字するレコードを登録していきます。
DataRow型の変数に値を登録し、table.Rows.Add()でテーブルに追加します。

    // 印字データを追加
    DataRow row;
    row = table.NewRow();
    row["id"]    = "iten_no1";
    row["name"]  = "りんご";
    row["price"] = 200;
    table.Rows.Add(row);




DataTableにデータを登録し終わったら、画面に貼り付けたCrystalReportDocumentに渡してあげます。
データのRefresh後、PrintToPrinterで印字処理を行います。

    // 印字データをセット
    crystalReport1.SetDataSource( table );
    crystalReport1.Refresh();
 
    // プリンタに印刷
    crystalReport1.PrintToPrinter( 0, false, 0, 0 );



上記の処理で、プログラムから指定したデータ郡を帳票印刷する事ができます。


※2012/3/20追記:
DataSet.xsdを作成すると自動でデータセットクラスが生成されるので、上記のコードは若干冗長でした。
詳細は下記のの追記記事を参照してください
DataSet.xsdを作成すると、自動でデータセットクラスが生成される。


動作確認


プログラムを実行しボタンをクリックします。
以下のように帳票が印刷されればOKです。



以上で,プログラムから指定したデータ郡を複数レコード印刷する作業は完了です。

関連記事

コメントを残す

メールアドレスが公開されることはありません。