FlexReport for WinForms
フィールドの変更

VBScript は、計算フィールドで式を評価する場合にのみ使用できるわけではありません。レポートのレンダリング時に実行されるスクリプトを指定することもできます。このようなスクリプトを使用して、レポートの書式設定を変更できます。これらのスクリプトは、イベントプロパティに置かれます。イベントプロパティは Visual Basic のイベントハンドラに似ていますが、レポートを表示するアプリケーションのスコープではなく、レポートのスコープ内でスクリプトが実行される点が異なります。

たとえば、イベントプロパティを使用すると、フィールドの Font プロパティや ForeColor プロパティをフィールドの値に基づいて設定できます。この動作は、レポート自体に組み込まれ、レンダリングに使用されるアプリケーションに関係なく保持されます。

もちろん、従来のイベントも使用できます。従来のイベントは、レポートではなくアプリケーションに影響を及ぼす動作を実装するために使用します。たとえば、StartPage イベントのハンドラを記述して、レンダリングされているレポートに関係なく、アプリケーションでページ数を更新できます。

次の表に、使用できるイベントプロパティと、その一般的な使用方法を示します。

オブジェクト プロパティ 説明
C1FlexReport OnOpen レポートがレンダリングを開始すると実行されます。ConnectionString プロパティや RecordSource プロパティを変更したり、VBScript の変数を初期化するために使用できます。
OnClose レポートがレンダリングを終了すると実行されます。クリーンアップ作業を実行するために使用できます。
OnNoData レポートのレンダリングが開始されたが、ソースレコードセットが空の場合に実行されます。Cancel プロパティを True に設定して、レポートの生成を中止できます。ダイアログボックスを表示して、レポートが表示されない理由をユーザーに知らせることもできます。
OnPage 新しいページが開始されると実行されます。さまざまなフィールドのセクションの Visible プロパティを状況に応じて設定するために使用できます。コントロールは、新しいページが開始されるたびに自動的に 1 ずつ増える Page 変数を保持しています。
OnError エラーが発生すると実行されます。
Section OnFormat セクション内のフィールドが評価される前に実行されます。この時点で、ソースレコードセット内のフィールドには、これからレンダリングされる値が反映されていますが、レポートフィールドには反映されていません。
OnPrint セクション内のフィールドが印刷される前に実行されます。この時点で、フィールドの評価は終了しており、条件付き書式設定を実行できます。

以下のトピックでは、これらのプロパティの一般的な使用例を示します。

値に応じたフィールドの書式設定

値に応じたフィールドの書式設定は、おそらく最も一般的なSection.OnPrintプロパティの使用方法です。製品別に注文数をグループ化してリストするレポートを例にします。別のフィールドを使用して在庫数を表示する代わりに、追加注文レベルに満たない製品の名前を赤色の太字で強調表示することにします。

追加注文レベルに満たない製品の名前を赤色の太字で強調表示するには、次のようなイベントスクリプトを使用します。

Dim script As String = _
  "If UnitsInStock < ReorderLevel Then" & vbCrLf & _
  "ProductNameCtl.ForeColor = RGB(255,0,0)" & vbCrLf & _
  "ProductNameCtl.Font.Bold = True" & vbCrLf & _
  "Else" & vbCrLf & _
  "ProductNameCtl.ForeColor = RGB(0,0,0)" & vbCrLf & _
  "ProductNameCtl.Font.Bold = False" & vbCrLf & _
  "End If"
C1Flexreport.Sections.Detail.OnPrint = script
 string script =
      "if (UnitsInStock& ReorderLevel) then\r\n" +
      "ProductNameCtl.ForeColor = rgb(255,0,0)\r\n" +
      "ProductNameCtl.Font.Bold = true\r\n" +
      "else\r\n" +
      "ProductNameCtl.ForeColor = rgb(0,0,0)\r\n" +
      "ProductNameCtl.Font.Bold = false\r\n" +
      "end if\r\n";
 c1FlexReport1.Sections.Detail.OnPrint = script;

コードを記述する代わりに、C1FlexReportDesigner アプリケーションを使用して、詳細セクションの Section.OnPrint プロパティの VBScript エディタに、次のスクリプトコードを直接入力できます。次の手順を実行します。

  1. Designer のプロパティペインのドロップダウンリストから、[詳細]を選択します。これで、セクションで使用できるプロパティが表示されます。
  2. OnPrint プロパティの横にある空のボックスをクリックし、ドロップダウン矢印をクリックして、リストから[式エディタ]を選択します。VBScript エディタウィンドウが表示されます。
  3. VBScript エディタウィンドウで、次のスクリプトを入力します。
           

    If UnitsInStock < ReorderLevel Then
      ProductNameCtl.ForeColor = RGB(255,0,0)
      ProductNameCtl.Font.Bold = True
    Else
      ProductNameCtl.ForeColor = RGB(0,0,0)
      ProductNameCtl.Font.Bold = False
    End If

  4. OK]をクリックして、エディタを閉じます。

コントロールは、このセクションを出力するたびに、この VBScript コードを実行します。スクリプトは、"ReorderLevel" データベースフィールドの値を取得し、その値に基づいて、"ProductName" レポートフィールドの Field.Font.Bold プロパティと Field.ForeColor プロパティを設定します。在庫が追加注文レベルに満たない製品は、製品名が赤色の太字になります。

次のスクリーンショットは、特別な効果が適用されたレポートのセクションです。

Formatting FlexReport Fields

データがないセクションの非表示

詳細セクションの OnFormat プロパティに式を指定することで、データに基づいてレポートフィールドの書式を変更できます。

たとえば、詳細セクションに画像コントロールを含むフィールドがあるが、レコードに画像データが存在しない場合に、そのレコードを非表示にできます。データ(この例では、レコードの画像)が存在しない場合に詳細セクションを非表示にするには、詳細セクションの OnFormat プロパティに次のスクリプトを追加します。

If isnull(PictureFieldName) Then
  Detail.Visible = false
 Else
  Detail.Visible = true
End If

データが存在しないセクション(この例では、レコードの画像)を非表示にするには、次のようなイベントスクリプトを使用します。

C1FlexReport1.Sections.Detail.OnFormat = "Detail.Visible = notisnull(PictureFieldName)"
c1FlexReport1.Sections.Detail.OnFormat = "Detail.Visible = notisnull(PictureFieldName)";

コードを記述する代わりに、C1FlexReportDesigner を使用して、詳細セクションの OnFormat プロパティの VBScript エディタに、次のスクリプトコードを直接入力できます。次の手順を実行します。

  1. Designer のプロパティペインのドロップダウンリストから、[詳細]を選択します。これで、セクションで使用できるプロパティが表示されます。
  2. OnFormat プロパティの横にある空のボックスをクリックし、ドロップダウン矢印をクリックして、リストから[式エディタ]を選択します。VBScript エディタウィンドウが表示されます。
  3. VBScript エディタで、次の作業を実行します。
    • Simply type the following script in the window:
      If isnull(PictureFieldName) Then
      Detail.Visible = false
      Else
      Detail.Visible = true
      End If

    • Or you could use the more concise version:
      Detail.Visible = not isnull(PictureFieldName)

値に基づいたフィールドの表示/非表示

フィールドの書式を変更してフィールドのコンテンツを強調表示する代わりに、別のフィールドの Visible プロパティを True または False に設定することで、特別な効果を生成することができます。たとえば、製品名を囲む「Shapefld」という名前の新しい図形フィールドを挿入し、その Visible プロパティを True に設定する場合は、スクリプトを次のように記述します。

If UnitsInStock < ReorderLevel Then Shapefld.Visible = True Else Shapefld.Visible = False End If

追加注文レベルに満たない製品にボックスを表示して強調表示するには、次のようなイベントスクリプトを使用します。

Dim script As String = _   
  "If UnitsInStock < ReorderLevel Then" & vbCrLf & _
  "  BoxCtl.Visible = True" & vbCrLf & _   
  "Else" & vbCrLf & _   
  "  BoxCtl.Visible = False" & vbCrLf & _   
  "End If"   
C1FlexReport1.Sections.Detail.OnPrint = script
string script =     
  "if (UnitsInStock < ReorderLevel) then\r\n" +    
  "BoxCtl.Visible = true\r\n" +    
  "else\r\n" +     
  "BoxCtl.Visible = false\r\n" +     
  "end if\r\n";   
c1FlexReport1.Sections.Detail.OnPrint = script;

このコードは、VBScript イベントハンドラを含む文字列を作成し、それをセクションの OnPrint プロパティに割り当てます。

To highlight products that are below the reorder level using FlexReportDesigner:

コードを記述する代わりに、C1FlexReportDesigner アプリケーションを使用して、詳細セクションの OnPrint プロパティの VBScript エディタに、次のスクリプトコードを直接入力できます。次の手順を実行します。

  1. Designer のプロパティペインのドロップダウンリストから、[詳細]を選択します。これで、セクションで使用できるプロパティが表示されます。
  2. OnPrint プロパティの横にある省略符をクリックして、VBScript エディタを開きます。
  3. VBScript エディタで、次のスクリプトを入力するだけです。
    
    If UnitsInStock < ReorderLevel Then 
    Shapefld.Visible = True
    Else
    Shapefld.Visible = False   
    End If
    

次のスクリーンショットは、特別な効果が適用されたレポートのセクションです。

 Show or Hide a Shape Field in FlexReport

ページカウンタのリセット

C1FlexReport.Page 変数は、コントロールによって作成されて自動的に更新されます。ページのヘッダーまたはフッターにページ数を追加する場合に便利です。新しいグループの先頭で、ページカウンタをリセットするとよい場合があります。たとえば、レコードを国別にグループ化しているレポートがあるとします。コードを追加するか、デザイナを使用して、ページカウンタをリセットできます。

コードを使用する場合

新しいグループ(新しい国など)の先頭でページカウンタをリセットするには、PageFooter フィールドの Text プロパティを設定します。次のコードを入力します。

C1FlexReport1.Fields("PageFooter").Text = "[ShipCountry] & "" "" & [Page]"
c1FlexReport1.Fields["PageFooter"].Text = "[ShipCountry] + [Page]";

FlexReportDesigner を使用する場合

新しいグループ(新しい国など)の先頭でページカウンタをリセットするには、次の手順に従って、PageFooter フィールドの Text プロパティを設定します。

  1. PageFooter のページ番号フィールドをデザイナのプロパティペインのドロップダウンリストから選択するか、設計ペインで選択します。これで、このフィールドのプロパティが表示されます。
  2. Text プロパティの横にあるボックスをクリックし、ドロップダウン矢印をクリックして、リストから[式エディタ]を選択します。VBScript エディタウィンドウが表示されます。
  3. VBScript エディタで、次のスクリプトを入力します。
    ="Page " & GroupPage(0) & " of " & GroupPages(0) & " for " & Country
  4. OK]をクリックして、エディタを閉じます。