ASP.NET を使用して複数ページのカスタム レポートを作成する

 

チャンドラ カマラカンタ
EDS Corporation

マリウス・ロション
Microsoft Corporation

2002 年 9 月

適用対象:
   Microsoft® ASP.NET
   Microsoft® Visual Studio® .NET

概要: デザイナー、データ バインディング、およびその他のランタイム機能の既存の Microsoft ASP.NET インフラストラクチャを使用して、単純で複雑なマルチページ HTML レポートを生成する方法について説明します。 (7ページ印刷)

Reporttool.exeをダウンロード します

内容

はじめに
私たちのアプローチ
データ バインディングを使用したレポートの作成
ランタイム
まとめ
謝辞
作成者について

はじめに

この記事では、既存の ASP.NET インフラストラクチャ (デザイナー、データ バインディング、およびその他のランタイム機能) を使用して、単純で複雑なレポートを生成する方法について説明します。 レポートは、複数のページのデータを含む HTML で構成されます。 一般に、Microsoft ASP.NET は、1 セットの UI コントロールを使用して、単一ページ フォームを処理するために使用されます。 レポートの目的で、すべてのレポート データが使い果たされるまで、同じ HTML 出力の繰り返しシーケンスを生成する ASP.NET を取得する必要があります。 これを実現するために、 System.Web.UI.Page クラスの機能を拡張しました。 特に、 Render メソッドがオーバーライドされ、デザイン時のプロパティが追加されました。 開発者は、新しいクラスを使用して、標準の Microsoft® Visual Studio® .NET Form Designerを使用してレポート ページをレイアウトし、そのプロパティと含まれるコントロールのプロパティを設定し、プロジェクトを実行して、受信データの連続する部分にバインドされた同じレイアウトの 1 つの HTTP 応答ストリームを生成できます。

このレポートによって生成される出力の例は、Report.htm ファイルに含まれています。

新しいクラスの機能を拡張して、複数の入力データ ストリーム、同じレポート内のいくつかの代替ページ レイアウト (たとえば、最初のページ、レポート合計ページ、詳細ページなど) の使用、ページ単位のページ全体を参照する機能 (サーバーへのラウンド トリップなし) を可能にしました。 関連するすべてのコードが ReportClass プロジェクトに含まれています。 MSDNArticleTest プロジェクトには、このフレームワークを使用したサンプル レポート定義が含まれています。

私たちのアプローチ

ASP.NET では、すぐに使える (HTML フォーム) レンダリングがサポートされています。 そのため、ユーザーのページ要求に応じてレポートの各ページをレンダリングするために使用できます。 ただし、レポート全体を生成するにはユーザーの介入が必要であり、サーバーへの移動の間にカーソルの状態を維持する必要があります。レポート全体を作成する必要がある場合は、コストがかかる可能性があります。

ただし、ASP.NET には、デザインとランタイムの両方の拡張機能フレームワークも用意されています。これにより、既定の動作を変更できます。 この方法では、新しいクラス (ReportPage) を使用して 、System.Web.UI.Page クラスの既定のフォーム処理をオーバーライドし、既定でフォーム ASP.NET 派生させます。

Report クラスの基本的な操作は、Render メソッドに組み込まれており、System.Web.UI.Page からRender メソッドをオーバーライド (および置換) します。

最初に、 Form タグに関連する HTML の生成はスキップされます。これは不要であり、実際には他のコントロール ID の繰り返しの使用に干渉します。 データセットには、( DataGrid のページ サイズを使用して) レポート ページを設定するための十分なデータが読み込まれます。 次に、 DataBind が呼び出され、データがページ上のすべてのコントロールに関連付けられます。 コントロールは、標準の Render メソッドを使用して レンダリング されます。データセットの読み込み以降、読み込まれるデータがなくなったまで操作が繰り返されます。 最後に、終了タグの Render メソッドが呼び出されます。

データ バインディングを使用したレポートの作成

作成するレポートの例 (および以下で説明) では、レポートに次の機能が提供されます。

  • すべての作成者を表示するためのマルチページ レポート (手順 1 ~ 13)
  • 作成者の状態が変更されたときの改ページ (手順 14)
  • 郵便番号の合計を追跡する (手順 15)
  • オーバーライドできるすべての関数を一覧表示する
  • レポートにページ ナビゲーションを追加する方法を示す (手順 17)

データ バインディングを使用してレポートを作成するには

  1. 新しいソリューションを作成し、"CustomReporting" という名前を付けます。

  2. クラス ライブラリ型の新しい C# プロジェクトを作成し、"ReportClass" という名前を付けます。

  3. Class1.cs モジュールを削除します。

  4. アタッチされている ReportPage.cs モジュールをコンピューターにダウンロードします。

  5. ReportClass プロジェクトをクリックし、[ 既存のアイテムの追加] をクリックして ReportPage.cs を ReportClass プロジェクトに追加します。

  6. System.Data および System.Web への参照を ReportClass プロジェクトに追加します。

  7. クラス ライブラリをビルドして、データ バインディングを使用してレポートを作成するステージを設定します。

  8. 新しい ASP.NET Web プロジェクトを CustomReporting ソリューションに追加し、"ReportWriterTest" という名前を付けます。

  9. ReportWriterTest で ReportClass への参照を追加します。 ([ 参照] をクリックし、[ プロジェクト ] タブで [ReportClass ] プロジェクトを選択します)。ReportClass.dllを含めます ( [選択したコンポーネント ] セクションに表示されます)。

  10. Reportclass を追加して WebForm1.aspx を編集します。

  11. public class WebForm1 : System.Web.UI.Pagepublic class TestReport : ReportClass.ReportPage に変更します。 これにより、テスト Web ページが ReportClass クラス ライブラリの一部である ReportPage クラスによって公開されるプロパティとメソッドを利用できるように、Web ページが ReportClass.ReportPage から継承されます。

  12. ReportWriterTest プロジェクトをビルドします。

  13. デザイナーで WebForm1.aspx を編集し、レポート レイアウトをデザインします。 この例では、Microsoft® SQL Server ™ に存在する pubs データベースの一部である authors テーブルについて報告します。

    WebForm1.aspx を編集してレポート レイアウトをデザインするには

    1. 2 つの行と 4 つの列で構成される HTML テーブルを追加します。
    2. HTML を編集し、テーブルの スタイル プロパティを削除します。
    3. cellSpacingcellPadding、および border を 0 に設定します。
    4. テーブルの行 1 に、2 つのラベル コントロールを追加します。 最初のラベルは Page タグ用で、2 番目のラベルにはページ番号が表示されます。そのため、"lblPage" と呼ばれ、テキストは空のスペースに設定する必要があります。
    5. テーブルの 2 行目に、2 つのラベル コントロールを追加します。 最初のラベル コントロールは、ラベル タグの状態に使用されます。 2 番目のラベル コントロールは "lblState" と呼ばれ、テキストは空の スペースに設定されます。
    6. 行 3 では、4 つの列のうち 3 つを削除して、1 つの列だけを残します。 列の幅をテーブルと同じサイズに設定します。
    7. HTML テーブルで、データ バインド グリッド コントロールを行 3 にドラッグします。
    8. データ バインド グリップ列コレクションを編集し、4 つの列を設定します。作成者の名、姓、住所、市区町村にそれぞれ 1 つ。 バインド列を使用し、郵便番号に対してページ合計を実行します。 注意: [実行時 に列を自動的に作成 する] をオフにします。
    9. 行 4 で、さらに 2 つのラベルを追加します。 最初のラベルのテキストは total に設定され、2 番目のラベルのテキストは 空のスペース に設定され、"lblTotal" という名前になります。
    10. テーブル全体をパネル内に埋め込み、パネルに Page1 の ID を指定します。 パネルがサーバー上で実行されるように設定されていることを確認します。
    11. 型指定されていないデータセットをフォームにドラッグします。
    12. [ プロパティ ] タブに移動し、[ WebForm1.aspx ] ページを選択します。 dataset プロパティをページ上のデータセットに設定します。 データ バインド グリッドをページ上のデータ バインド グリッドに設定します。
    13. Web ページの Page_Load イベントにデータセットを設定します。
    14. データセットを設定するコードを含めます。
      private void Page_Load(object sender, System.EventArgs e)
      {
      if ( IsPostBack) return;
      string sConnectionString = "Provider=SQLOLEDB;data source=.;
      initial catalog=pubs; User ID=sa; Password=****";
      string sSQL = "select au_lname, au_fname, address, city, state,
      zip from authors order by state";
      OleDbConnection dbCon = new OleDbConnection(sConnectionString);
      OleDbCommand dbCmd;
      OleDbDataAdapter dbAdapt = new OleDbDataAdapter();
      try
      {
      dbCon.Open();
      dbCmd = new OleDbCommand(sSQL, dbCon);
      dbAdapt.SelectCommand = dbCmd;
      dbAdapt.Fill(dataSet1);
      dbAdapt.Dispose();
      dbCmd.Dispose();
      }
      catch (Exception e1)
      {
      Response.Write("Database error   " + e1.Message);
      }
      finally
      {
      dbCon.Close();
      dbCon.Dispose();
      }
      }
      
  14. 列に基づいてページ グループ/グループ区切りを設定します。

   base.TrackColumnBreaks("one", "state");

   This will provide an override function and exposes the row that accounted for column/page break.
      protected override void ProcessPageBreak()
      {
         lblState.Text  = CurrentDataRow["state"].ToString();
   }
  1. 合計の設定と追跡:

    base.TrackTotals("zip",ReportClass.TotalsScopeEnum.Page);
    base.TrackTotals("zip",ReportClass.TotalsScopeEnum.Report);

  2. オーバーライドできるその他の関数は、 ProcessPageBreakPostProcessPageBreakProcessGroupBreakPostProcessGroupBreakProcessReportEndProcessCurrentRow ですProcessCurrentRow のオーバーライドは推奨されません。 これらの関数をオーバーライドして、特定の条件に基づいて内容をリセットして印刷することができます。

  3. ナビゲーション バーをレポートに追加するには、プロジェクトにPagenav.jsを含め、すべてのレポート ページに含めます。 ViewReport.aspx、Reportdetail.htm、プロジェクトへのReportheader.htmを含めます。 ShowReport.aspx には、ページ ナビゲーションで Viewreport.aspx を呼び出す方法の例があります。 このナビゲーションで行う唯一の作業は、リンク間の移動です (例: https://localhost/MSDNTest/WebForm1.aspx#Page[1-n])。

ランタイム

このレポートを実行するとどうなりますか? Report クラスの根性は、標準の Page クラスの同じメソッドをオーバーライドする Render メソッドにあります。

開始 HTML タグは、 Controls[0].render メソッドを呼び出すことによってレンダリングされます。 ある段階で Control.RenderPage.VerifyRenderingInServerForm を呼び出します。 この関数の既定の実装では、例外が発生します。そのため、何も行わないよう Report クラスでオーバーライドされます。

ReportClass は、データセット テーブル [0] を反復処理して複数ページのレポートを作成します。 LoadPage メソッドは、レポートの次のページを生成するのに十分なデータを含む DataSet を読み込む (最初に Clear) するために呼び出されます。 LoadPage メソッドはオーバーライド可能であるため、ここで独自のロジックを提供できます。 また、 LoadPage メソッドは仮想関数 OnNextRow を呼び出します。これをオーバーライドして、データ中断の検出、サブ合計の計算 (データセット内のテーブルに格納する) などの特別な処理を実行できます。これらのメソッドをオーバーライドし、強制的に改ページする場合は、Report.m_PageFullを True に設定 します。 それ以上の出力を完全に停止するには、 MoreData を True に設定 しますLoadPage はDataBind メソッドを呼び出します。

Page.Render メソッドは Html を挿入して、改ページを強制します。 AllControls.RenderControls メソッドは、ページ上のコントロールのレンダリングを強制するために呼び出されます。 この手順は、指定されたデータセットでデータ行が使い果たされるまで繰り返されます。 閉じる HTML タグが呼び出されます (Controls[2]。RenderControl)、データベース接続が閉じられ、 レンダリング が完了します。

まとめ

このサンプルでは、比較的少数のコード行で、HTML フォームのレンダリングからマルチページ レポートの生成に ASP.NET の基本的なパラダイムを変更する方法を示します。 既存の ASP.NET インフラストラクチャのほとんどはそのまま残っています。すべてのツールボックス コントロールを使用できます。レンダリング プロパティはプロパティ ウィンドウを通じて設定でき、実際のレンダリングは既存のコードによって引き続き実行されます。 しかし、結果の出力は大きく異なる目的を果たします。

謝辞

私たちは、次の人々に感謝したいと思います:

Microsoft コンサルティング サービスの David Powell と Scott Beaudreau は、.NET の使用を開始し、プロジェクトの初期段階を通じてチームを指導するのに役立ちます

マーク・ワズワース、フランク・デイジス、リンダ・サットンは、出版を進めるために継続的な支援と励ましを受けました。

EDS Corporation のチャンドラのチームメイトと、すべてのバグのテストと修正に役立つ Tushar Patwardhan と Neeraj Pathania。

作成者について

チャンドラ・カマラカンタは、世界をリードする情報技術 (IT) サービス企業 である EDS Corporation に勤務しています。 で Chandra Chandra.kamalakantha@eds.comに質問とコメントを送信します。

マリウス・ロションは、Microsoft Corporation の技術エバンジェリストです。

© Microsoft Corporation. All rights reserved.