Reports for WinForms
レポート定義の作成
C1Report の使い方 > レポートの作成、読み込み、描画 > レポート定義の作成

以下のトピックでは、C1ReportDesigner またはコードを使用したレポート定義の作成方法を説明します。レポート定義の作成はレポートのレンダリングと同じではないことに注意してください。レポートをレンダリングするには、単に既存の定義をロードし、Render メソッドを呼び出すことができます。

C1ReportDesigner を使用したレポート定義の作成

レポート定義を作成する最も簡単な方法は、Microsoft Access のレポートデザイナに似たスタンドアロン型アプリケーションである C1ReportDesigner を使用することです。C1Report ウィザードは、新しいレポートを作成する手順を段階的に最初から最後までガイドしてくれます。

新しいレポートの作成手順の詳細については、「基本的なレポート定義ファイルの作成」を参照してください。

コードを使用したレポート定義の作成

コードを使用して最初からレポートを作成することもできます。この方法では、いくつかの特別な作業が必要になりますが、たいへん柔軟にレポートを作成できます。独自のレポートデザイナを記述したり、アドホックなレポートジェネレータを作成することもできます。

次の例は、コードを使用して、NorthWind データベースに基づく単純な表形式のレポート定義を作成します。コードにはコメントが付けられ、C1Report オブジェクトモデルの最も重要な要素が例示されています。次の手順を実行します。

  1. 最初に、フォームに C1Report、C1PrintPreviewControl コントロールを追加し、名前を次のように設定します。

    Button.Name = btnEmployees

    C1Report.Name = c1r

    C1PrintPreviewControl.Name = ppv

  2. C1Report コントロールを初期化します。 Clear メソッドを使ってコンテンツを削除し、コントロールのフォントを設定します。このフォントは、新しいフィールドに割り当てられます。(以降のコードは、すべてフォームロードイベント内に記述します。)

    Visual Basic コードの書き方

    Visual Basic
    コードのコピー
     ' コントロールを初期化します。
    With c1r
       ' 既存のフィールドを削除します。
      .Clear()
       ' 全てのコントロールのデフォルトフォントを設定します。
      .Font.Name = "Tahoma"
      .Font.Size = 8
    End With
    

    C# コードの書き方

    C#
    コードのコピー
    // コントロールを初期化します。
    // 既存のフィールドを削除します。
    c1r.Clear();
    // 全てのコントロールのデフォルトフォントを設定します。
    c1r.Font.Name = "Tahoma";
    c1r.Font.Size = 8;
    
  3. 次に、DataSource オブジェクトを設定し、NorthWind データベースから必要なデータを取得します。これには、ConnectionString プロパティとRecordSourceプロパティを使用します(Microsoft ADO DataControl と同様)。

    Visual Basic コードの書き方

    Visual Basic
    コードのコピー
    ' データソースを初期化します。    
    With c1r.DataSource    
      .ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;" & _    
                          "Data Source=C:\...\ComponentOne Samples\Common\Nwind.mdb;" & _    
                          "Persist Security Info=False"    
      .RecordSource = "Employees"    
    End With
    

    C# コードの書き方

    C#
    コードのコピー
    //データソースを初期化します。    
    DataSource ds = c1r.DataSource;    
    ds.ConnectionString = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\...\ComponentOne Samples\Common\Nwind.mdb;";    
    ds.RecordSource = "Employees";
    
  4. 次に、ページ上のレポートのレイアウト方法を定義する Layout オブジェクトを初期化します。ここでは、レポートの出力方法を縦置きモードに、Width を 6.5 インチ(ページ幅の 8.5 インチから、両側のマージン各1インチを引いた値)に設定します。

    Visual Basic コードの書き方

    Visual Basic
    コードのコピー
    ' レイアウトを初期化します。    
    With c1r.Layout   
      .Orientation = OrientationEnum.Portrait    
      .Width = 6.5 * 1440 ' 8.5 - margins, in twips    
    End With
    

    C# コードの書き方

    C#
    コードのコピー
    // レイアウトを初期化します。    
    Layout l = c1r.Layout;    
    l.Orientation = OrientationEnum.Portrait;   
    l.Width = 6.5 * 1440; // 8.5 - margins, in twips
    
  5. 次が最も注目すべき部分です。すべてのレポートには、5つの基本セクション(詳細・レポートヘッダ・レポートフッタ・ページヘッダ・ページフッタ)があります。まず、いくつかのプロパティを設定し、タイトルフィールドを追加して、レポートヘッダを設定します。

    Visual Basic コードの書き方

    Visual Basic
    コードのコピー
    ' レポートフィールドの作成とフォーマットに使用する変数。    
    Dim f As Field
    
    ' レポートヘッダを作成します。r    
     With c1r.Sections(SectionTypeEnum.Header)    
      .Height = 1440    
      .Visible = True    
      .BackColor = Color.FromArgb(200, 200, 200)    
      f = .Fields.Add("FldTitle", "Employees Report", 0, 0, 8000, 1440)    
      f.Font.Size = 24    
      f.Font.Bold = True    
      f.ForeColor = Color.FromArgb(0, 0, 100)    
    End With
    

    C# コードの書き方

    C#
    コードのコピー
    // レポートフィールドの作成とフォーマットに使用する変数。    
     Field f;   
      
    // レポートヘッダを作成します。    
    Section s = c1r.Sections[SectionTypeEnum.Header];    
      s.Height = 1440;    
      s.Visible = true;    
      s.BackColor = Color.FromArgb(200, 200, 200);    
      f = s.Fields.Add("FldTitle", "Employees Report", 0, 0, 8000, 1440);    
      f.Font.Size = 24;    
      f.Font.Bold = true;    
      f.ForeColor = Color.FromArgb(0, 0, 100);
    

    上のセクションオブジェクトには、Fields  コレクションがあります。このコレクションのAdd メソッドは、新しいフィールドを作成し、それをセクションに割り当てます。パラメータには、新しいフィールドの Name,、TextLeftTopWidth、およびHeight の各プロパティを指定しています。デフォルトでは、フィールドのフォントはコントロールと同じです。このフィールドはタイトルなので、フォントを変更してサイズを大きくしています。フォントサイズに合わせてフィールドの高さを十分大きくするように注意してください。フォントサイズに対してフィールドの高さが十分でない場合、何も表示されません。 

  6. 次に、ページフッタセクションを設定します。このセクションには計算フィールドが含まれており、さらに興味深いコードになっています。計算フィールドは、Text プロパティに VBScript 式が含まれており、これらの式はレポートの出力時に評価されます。計算フィールドを作成するには、Calculatedプロパティを True に設定します。:

    Visual Basic コードの書き方

    Visual Basic
    コードのコピー
    ' ページを作成します。    
    With c1r.Sections(SectionTypeEnum.PageFooter)    
      .Height = 500    
      .Visible = True    
      f = .Fields.Add("FldFtrLeft", """Employees: Printed on "" & Now",_    
                      0, 0, 4000, 300)    
      f.Calculated = True    
      f = .Fields.Add("FldFtrRight", """Page "" & Page & "" of "" & Pages",_    
                      4000, 0, 4000, 300)    
      f.Calculated = True    
      f.Align = FieldAlignEnum.RightTop    
      f.Width = c1r.Layout.Width - f.Left    
      f = .Fields.Add("FldLine", "", 0, 0, c1r.Layout.Width, 20)    
      f.LineSlant = LineSlantEnum.NoSlant    
      f.BorderStyle = BorderStyleEnum.Solid    
      f.BorderColor = Color.FromArgb(0, 0, 100)    
    End With
    

    C# コードの書き方

    C#
    コードのコピー
    // ページを作成します。    
    s = c1r.Sections[SectionTypeEnum.PageFooter];    
      s.Height = 500;    
      s.Visible = true;   
      f = s.Fields.Add("FldFtrLeft", @"""Employees: Printed on "" & Now",_    
                      0, 0, 4000, 300);    
      f.Calculated = true;    
      f = .Fields.Add("FldFtrRight", @"""Page "" + Page + "" of "" & Pages",_    
                      4000, 0, 4000, 300);    
      f.Calculated = true;    
      f.Align = FieldAlignEnum.RightTop;    
      f.Width = c1r.Layout.Width - f.Left;    
      f = s.Fields.Add("FldLine", "", 0, 0, c1r.Layout.Width, 20);    
      f.LineSlant = LineSlantEnum.NoSlant;    
      f.BorderStyle = BorderStyleEnum.Solid;    
      f.BorderColor = Color.FromArgb(0, 0, 100);
    

    このページフッタセクションの式では、VBScript 固有の変数ではなく、C1Reportで定義されている変数が使用されています。Page および Pages は、現在のページ番号と総ページ数を含む変数です。また、このセクションでは、1本の線として表示されるように設定されたフィールドを使用しています。そのために、BorderStyle プロパティとLineSlant  プロパティが使用されています。

  7. 次に、ページヘッダセクションを設定します。このセクションは、各ページの上部に出力され、フィールドラベルが表示されます。ページヘッダセクションをフィールドラベルの表示に使用するのは、表形式のレポートにおける一般的なテクニックです。すべてのフィールドのサイズを指定しているため、多少煩雑に見えるかもしれませんが、コード自体はシンプルです。実際のアプリケーションでは、これらの値はプログラムに組み込まれることはありません。

    Visual Basic コードの書き方

    Visual Basic
    コードのコピー
    ' フィールドラベルを含むページヘッダを作成します。    
    With c1r.Sections(SectionTypeEnum.PageHeader)    
      .Height = 500    
      .Visible = True    
      c1r.Font.Bold = True    
      f = .Fields.Add("LblID", "ID", 0, 50, 400, 300)    
      f.Align = FieldAlignEnum.RightTop    
      f = .Fields.Add("LblFirstName", "First", 500, 50, 900, 300)    
      f = .Fields.Add("LblLastName", "Last", 1500, 50, 900, 300)    
      f = .Fields.Add("LblTitle", "Title", 2500, 50, 2400, 300)    
      f = .Fields.Add("LblTitle", "Notes", 5000, 50, 8000, 300)    
      c1r.Font.Bold = False    
      f = .Fields.Add("FldLine", "", 0, 400, c1r.Layout.Width, 20)    
      f.LineSlant = LineSlantEnum.NoSlant    
      f.LineWidth = 50
    
      f.BorderColor = Color.FromArgb(100, 100, 100)    
    End With
    

    C# コードの書き方

    C#
    コードのコピー
    //フィールドラベルを含むページヘッダを作成します。   v 
    s = c1r.Sections[SectionTypeEnum.PageHeader];    
      s.Height = 500;    
      s.Visible = true;    
      c1r.Font.Bold = true;    
      f = s.Fields.Add("LblID", "ID", 0, 50, 400, 300);    
      f.Align = FieldAlignEnum.RightTop;    
      f = s.Fields.Add("LblFirstName", "First", 500, 50, 900, 300);    
      f = s.Fields.Add("LblLastName", "Last", 1500, 50, 900, 300);    
      f = s.Fields.Add("LblTitle", "Title", 2500, 50, 2400, 300);    
      f = s.Fields.Add("LblTitle", "Notes", 5000, 50, 8000, 300);    
      c1r.Font.Bold = false;    
      f = s.Fields.Add("FldLine", "", 0, 400, c1r.Layout.Width, 20);    
      f.LineSlant = LineSlantEnum.NoSlant;    
      f.LineWidth = 50;    
      f.BorderColor = Color.FromArgb(100, 100, 100);
    

    上のコードは、フォントを処理する効果的なテクニックの例を示しています。すべてのフィールドは、作成時にコントロールのフォントを継承するため、フィールドを作成する前にコントロールの Font.Bold プロパティを True に設定し、後でこの設定を False に戻します。これにより、ページヘッダセクション内のすべてのコントロールのフォントが太字になります。

  8. 次に詳細セクションを追加して、レポートを完成させます。詳細セクションは、実際のデータを表示するセクションです。ページヘッダセクションの各ラベルの下に、計算フィールドを設定します。

    Visual Basic コードの書き方

    Visual Basic
    コードのコピー
    ' 詳細セクションを作成します。    
    With c1r.Sections(SectionTypeEnum.Detail)    
      .Height = 330    
      .Visible = True    
      f = .Fields.Add("FldID", "EmployeeID", 0, 0, 400, 300)    
      f.Calculated = True    
      f = .Fields.Add("FldFirstName", "FirstName", 500, 0, 900, 300)    
      f.Calculated = True    
      f = .Fields.Add("FldLastName", "LastName", 1500, 0, 900, 300)    
      f.Calculated = True    
      f = .Fields.Add("FldTitle", "Title", 2500, 0, 2400, 300)    
      f.Calculated = True    
      f = .Fields.Add("FldNotes", "Notes", 5000, 0, 8000, 300)    
      f.Width = c1r.Layout.Width - f.Left    
      f.Calculated = True   
      f.CanGrow = True    
      f.Font.Size = 6    
      f.Align = FieldAlignEnum.JustTop    
      f = .Fields.Add("FldLine", "", 0, 310, c1r.Layout.Width, 20)    
      f.LineSlant = LineSlantEnum.NoSlant   
      f.BorderStyle = BorderStyleEnum.Solid    
      f.BorderColor = Color.FromArgb(100, 100, 100)    
    End With
    

    C# コードの書き方

    C#
    コードのコピー
    //  詳細セクションを作成します。    
    s = c1r.Sections[SectionTypeEnum.Detail];    
      s.Height = 330;    
      s.Visible = true;    
      f = s.Fields.Add("FldID", "EmployeeID", 0, 0, 400, 300);    
      f.Calculated = true;    
      f = s.Fields.Add("FldFirstName", "FirstName", 500, 0, 900, 300);    
      f.Calculated = true;    
      f = s.Fields.Add("FldLastName", "LastName", 1500, 0, 900, 300);    
      f.Calculated = true;    
      f = s.Fields.Add("FldTitle", "Title", 2500, 0, 2400, 300);    
      f.Calculated = true;    
      f = s.Fields.Add("FldNotes", "Notes", 5000, 0, 8000, 300);    
      f.Width = c1r.Layout.Width - f.Left;    
      f.Calculated = true;    
      f.CanGrow = true;    
      f.Font.Size = 6;    
      f.Align = FieldAlignEnum.JustTop;    
      f = s.Fields.Add("FldLine", "", 0, 310, c1r.Layout.Width, 20);    
      f.LineSlant = LineSlantEnum.NoSlant;   
      f.BorderStyle = BorderStyleEnum.Solid;    
      f.BorderColor = Color.FromArgb(100, 100, 100);
    

    すべてのフィールドが計算フィールドであること、また各フィールドのText プロパティがソースレコードセット内のフィールド名に対応していることに注意してください。Calculated プロパティを True に設定すると、Text プロパティはテキストどおりに出力されるのではなく、データベースのフィールド名として認識されます。レポートのフィールド名がレコードセット内のフィールド名とは異なる一意の名前になるように、名前付け規則を決める必要があります。たとえば、"LastName" という名前のフィールドが2つあると、「Left(LastName,1)」という式はあいまいになります。この例では、レポートのフィールド名はすべて "Fld" で始まるという名前付け規則を採用しました。

    また、"FldNotes" フィールドのCanGrow プロパティが True に設定され、他より小さいフォントが設定されていることにも注目してください。これは、データベースの "Notes" フィールドには多くのテキストが含まれており、レポートにそれらをすべて表示するためです。フィールドの高さを大きく設定して無駄なスペースをとるのではなく、CanGrow プロパティを True に設定して、コントロールがコンテンツに合わせてフィールドを拡張するようにしています。また、このフィールドを含むセクションのCanGrow プロパティも True に設定されるため、フィールドがセクションからはみ出ることはありません。

  9. これで、レポート定義は完了です。レポートを C1PrintPreview コントロールにレンダリングするには、次のコードを入力します。

    Visual Basic コードの書き方

    Visual Basic
    コードのコピー
    RenderEmployees()    
    ' レポートを C1PrintPreview コントロールにレンダリングします    
    ppv.Document = c1r.Document
    

    C# コードの書き方

    C#
    コードのコピー
    RenderEmployees();    
    // レポートを C1PrintPreview コントロールにレンダリングします    
    ppv.Document = c1r.Document;
    

    基本レポートの外観は次のようになります。