作成日: 2022/08/08 最終更新日: 2022/08/08
文書種別
使用方法
詳細
メインレポートおよびサブレポートのデータソースとしてDataTableを利用する場合、各レポートのフィールドに対してDataTableの列名をマッピングする必要があります。
メインレポートのマッピングは、フィールド(TextField)のTextプロパティにDataTableの列名を設定することで行えます。
しかし、サブレポート(メインレポートのサブレポートフィールドで設定)のフィード(Fields)にはTextプロパティが存在しないため、いったん通常のTextFieldにキャストした後そのTextプロパティに列名を設定します。
以下に、メインレポート、サブレポートを異なるDataTableにバインドして表示するサンプルを紹介します。
(設定手順)
(1)メインレポート定義ファイルの作成
レポートデザイナで、下記の名前を持つ各種フィールドを詳細セクションに配置し、MainRpt.flxrという名前のレポート定義ファイルとして保存します。
・TextFieldフィールド:CategoryIDCtl1、CategoryNameCtl1、DescriptionCtl1
・SubReportFieldフィールド:SubReport1(下記画像の「サブレポート」部分)

(2)サブレポート定義ファイルの作成
レポートデザイナで、下記の名前を持つ各種フィールドを詳細セクションに配置し、SubRpt.flxrという名前のレポート定義ファイルとして保存します。
・TextFieldフィールド:ProductIDCtl、ProductNameCtl、UnitPriceCtl、CategoryIDCtl

(3)レポート表示用プロジェクトの作成
次の手順に沿って、設定を行ってください。
・新規.Net Frameworkプロジェクトで、フォーム上にC1FlexViewerを貼り付けます。
・メインレポート用/サブレポート用のDataTableを作成します。
・メインレポート用/サブレポート用の新規C1FlexReportをコードで追加します。
・メインレポートのSubreportFieldに、上記のサブレポートを設定します。
・メインレポート/サブレポートの各フィールドに対してDataTableの列名をマッピングします。
・サブレポートのフィルタ式を定義します(※必要な場合)。
・C1FlexViewerにレポートを表示します。
以下に簡単な設定コードを紹介します。
プロジェクトにコードを追加してビルドし実行すると、以下のようなレポートが表示されます。

◎サンプルコード(VB)
メインレポートのマッピングは、フィールド(TextField)のTextプロパティにDataTableの列名を設定することで行えます。
しかし、サブレポート(メインレポートのサブレポートフィールドで設定)のフィード(Fields)にはTextプロパティが存在しないため、いったん通常のTextFieldにキャストした後そのTextプロパティに列名を設定します。
var field1 = new SubreportField();
field1.Subreport = SubRpt;
TextField txtFld1 = (TextField)field1.Subreport.Fields["ProductIDCtl"];
txtFld1.Text = "=ProductID";"
以下に、メインレポート、サブレポートを異なるDataTableにバインドして表示するサンプルを紹介します。
(設定手順)
(1)メインレポート定義ファイルの作成
レポートデザイナで、下記の名前を持つ各種フィールドを詳細セクションに配置し、MainRpt.flxrという名前のレポート定義ファイルとして保存します。
・TextFieldフィールド:CategoryIDCtl1、CategoryNameCtl1、DescriptionCtl1
・SubReportFieldフィールド:SubReport1(下記画像の「サブレポート」部分)

(2)サブレポート定義ファイルの作成
レポートデザイナで、下記の名前を持つ各種フィールドを詳細セクションに配置し、SubRpt.flxrという名前のレポート定義ファイルとして保存します。
・TextFieldフィールド:ProductIDCtl、ProductNameCtl、UnitPriceCtl、CategoryIDCtl

(3)レポート表示用プロジェクトの作成
次の手順に沿って、設定を行ってください。
・新規.Net Frameworkプロジェクトで、フォーム上にC1FlexViewerを貼り付けます。
・メインレポート用/サブレポート用のDataTableを作成します。
・メインレポート用/サブレポート用の新規C1FlexReportをコードで追加します。
・メインレポートのSubreportFieldに、上記のサブレポートを設定します。
・メインレポート/サブレポートの各フィールドに対してDataTableの列名をマッピングします。
・サブレポートのフィルタ式を定義します(※必要な場合)。
・C1FlexViewerにレポートを表示します。
以下に簡単な設定コードを紹介します。
プロジェクトにコードを追加してビルドし実行すると、以下のようなレポートが表示されます。

◎サンプルコード(VB)
Imports C1.Win.FlexReport
Public Class Form1
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
' レポートの読み込み(メイン、サブ)
Dim MainRpt As C1FlexReport = New C1FlexReport
MainRpt.Load((Application.StartupPath + "\..\..\MainRpt.flxr"), "Categories レポート")
MainRpt.DataSource.Recordset = GetMainDataTable()
Dim SubRpt As C1FlexReport = New C1FlexReport
SubRpt.Load((Application.StartupPath + "\..\..\SubRpt.flxr"), "Products レポート")
SubRpt.DataSource.Recordset = GetSubDataTable()
' メインレポートのSubreportFieldにサブレポートを設定
CType(MainRpt.Fields("SubReport1"), SubreportField).Subreport = SubRpt
' TextFieldの設定(メインレポート)
Dim tField1 As TextField = CType(MainRpt.Fields("CategoryIDCtl1"), TextField)
tField1.Text = "=CategoryID"
Dim tField2 As TextField = CType(MainRpt.Fields("CategoryNameCtl1"), TextField)
tField2.Text = "=CategoryName"
Dim tField3 As TextField = CType(MainRpt.Fields("DescriptionCtl1"), TextField)
tField3.Text = "=Description"
' TextFieldの設定(サブレポート)
Dim field0 As SubreportField = New SubreportField()
field0.Subreport = SubRpt
Dim txtFld0 As TextField = CType(field0.Subreport.Fields("CategoryIDCtl"), TextField)
txtFld0.Text = "=CategoryID"
field0.Subreport.Fields("CategoryIDCtl").Visible = False
Dim field1 As SubreportField = New SubreportField()
field1.Subreport = SubRpt
Dim txtFld1 As TextField = CType(field1.Subreport.Fields("ProductIDCtl"), TextField)
txtFld1.Text = "=ProductID"
Dim field2 As SubreportField = New SubreportField()
field2.Subreport = SubRpt
Dim txtFld2 As TextField = CType(field2.Subreport.Fields("ProductNameCtl"), TextField)
txtFld2.Text = "=ProductName"
Dim field3 As SubreportField = New SubreportField()
field3.Subreport = SubRpt
Dim txtFld3 As TextField = CType(field3.Subreport.Fields("UnitPriceCtl"), TextField)
txtFld3.Text = "=Cost"
' サブレポートのフィルタ式を定義
Dim str1 As String = Chr(39).ToString() 'シングルクォーテーション
Dim str2 As String = Chr(34).ToString() 'ダブルクォーテーション
Dim str3 As String = Chr(91).ToString() ' [
Dim str4 As String = Chr(93).ToString() ' ]
Dim ssv As ScriptStringValue = New ScriptStringValue()
ssv.Expression = str2 + str3 + "CategoryID" + str4 + " = " + str1 + str2 + " & " + str3 + "CategoryID" + str4 + " & " + str2 + str1 + str2
'※レポートデザイナのSubReportFilterプロパティの式エディタを使用する場合は、下記のように入力します(ダブルクォーテーションもそのまま)
' "[CategoryID] = '" & [CategoryID] & "'"
Dim fieldSub As SubreportField = CType(MainRpt.Fields("SubReport1"), SubreportField)
fieldSub.SubreportFilter = ssv
' レポートの表示
MainRpt.Render()
C1FlexViewer1.DocumentSource = MainRpt
End Sub
Private Function GetMainDataTable() As DataTable
Dim dtMain As DataTable = New DataTable()
dtMain.Columns.Add("CategoryID", GetType(Integer))
dtMain.Columns.Add("CategoryName", GetType(String))
dtMain.Columns.Add("Description", GetType(String))
dtMain.Rows.Add(1, "Fruits", "Fruit Sample")
dtMain.Rows.Add(2, "Animals", "Animal Sample")
dtMain.Rows.Add(3, "Vagetable", "Vagetable Sample")
Return dtMain
End Function
Private Function GetSubDataTable() As DataTable
Dim dtSub As DataTable = New DataTable()
dtSub.Columns.Add("ProductID", GetType(Integer))
dtSub.Columns.Add("ProductName", GetType(String))
dtSub.Columns.Add("CategoryID", GetType(Integer))
dtSub.Columns.Add("Cost", GetType(Integer))
dtSub.Rows.Add(1, "Banana", 1, 235)
dtSub.Rows.Add(2, "Dog", 2, 235)
dtSub.Rows.Add(3, "Lemon", 3, 247)
dtSub.Rows.Add(4, "Mango", 1, 8599)
dtSub.Rows.Add(5, "Cucumbar", 3, 6809)
dtSub.Rows.Add(7, "Horse", 2, 25)
dtSub.Rows.Add(8, "Capsicum", 3, 2534)
dtSub.Rows.Add(9, "Guava", 1, 865)
dtSub.Rows.Add(10, "Goat", 2, 233)
dtSub.Rows.Add(11, "Chilley", 3, 452)
dtSub.Rows.Add(12, "Cheery", 1, 63853)
dtSub.Rows.Add(13, "Cow", 2, 356736)
dtSub.Rows.Add(14, "Donkey", 2, 3456)
dtSub.Rows.Add(15, "Watermelon", 1, 3452)
Return dtSub
End Function
End Class
◎サンプルコード(C#)
using C1.Win.FlexReport;
namespace prj_FlexReport
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
// レポートの読み込み(メイン、サブ)
C1FlexReport MainRpt = new C1FlexReport();
MainRpt.Load(Application.StartupPath + @"\..\..\MainRpt.flxr", "Categories レポート");
MainRpt.DataSource.Recordset = GetMainDataTable();
C1FlexReport SubRpt = new C1FlexReport();
SubRpt.Load(Application.StartupPath + @"\..\..\SubRpt.flxr", "Products レポート");
SubRpt.DataSource.Recordset = GetSubDataTable();
// メインレポートのSubreportFieldにサブレポートを設定
(MainRpt.Fields["SubReport1"] as SubreportField).Subreport = SubRpt;
// TextFieldの設定(メインレポート)
TextField tField1 = (TextField)MainRpt.Fields["CategoryIDCtl1"];
tField1.Text = "=CategoryID";
TextField tField2 = (TextField)MainRpt.Fields["CategoryNameCtl1"];
tField2.Text = "=CategoryName";
TextField tField3 = (TextField)MainRpt.Fields["DescriptionCtl1"];
tField3.Text = "=Description";
// TextFieldの設定(サブレポート)
var field0 = new SubreportField();
field0.Subreport = SubRpt;
TextField txtFld0 = (TextField)field0.Subreport.Fields["CategoryIDCtl"];
txtFld0.Text = "=CategoryID";
field0.Subreport.Fields["CategoryIDCtl"].Visible = false;
var field1 = new SubreportField();
field1.Subreport = SubRpt;
TextField txtFld1 = (TextField)field1.Subreport.Fields["ProductIDCtl"];
txtFld1.Text = "=ProductID";
var field2 = new SubreportField();
field2.Subreport = SubRpt;
TextField txtFld2 = (TextField)field2.Subreport.Fields["ProductNameCtl"];
txtFld2.Text = "=ProductName";
var field3 = new SubreportField();
field3.Subreport = SubRpt;
TextField txtFld3 = (TextField)field3.Subreport.Fields["UnitPriceCtl"];
txtFld3.Text = "=Cost";
// サブレポートのフィルタ式を定義
C1.Win.FlexReport.ScriptStringValue ssv = new ScriptStringValue();
ssv.Expression = "\"" + "[CategoryID] = '" + "\"" + " & [CategoryID] & " + "\"" + "'" + "\"";
//※レポートデザイナのSubReportFilterプロパティの式エディタを使用する場合は、下記のように入力します(ダブルクォーテーションもそのまま)
// "[CategoryID] = '" & [CategoryID] & "'"
var fieldSub = MainRpt.Fields["SubReport1"] as SubreportField;
fieldSub.SubreportFilter = ssv;
// レポートの表示
MainRpt.Render();
c1FlexViewer1.DocumentSource = MainRpt;
}
DataTable GetMainDataTable()
{
DataTable dtMain = new DataTable();
dtMain.Columns.Add("CategoryID", typeof(Int32));
dtMain.Columns.Add("CategoryName", typeof(String));
dtMain.Columns.Add("Description", typeof(String));
dtMain.Rows.Add(1, "Fruits", "Fruit Sample");
dtMain.Rows.Add(2, "Animals", "Animal Sample");
dtMain.Rows.Add(3, "Vagetable", "Vagetable Sample");
return dtMain;
}
DataTable GetSubDataTable()
{
DataTable dtSub = new DataTable();
dtSub.Columns.Add("ProductID", typeof(Int32));
dtSub.Columns.Add("ProductName", typeof(String));
dtSub.Columns.Add("CategoryID", typeof(Int32));
dtSub.Columns.Add("Cost", typeof(Int32));
dtSub.Rows.Add(1, "Banana", 1, 235);
dtSub.Rows.Add(2, "Dog", 2, 235);
dtSub.Rows.Add(3, "Lemon", 3, 247);
dtSub.Rows.Add(4, "Mango", 1, 8599);
dtSub.Rows.Add(5, "Cucumbar", 3, 6809);
dtSub.Rows.Add(7, "Horse", 2, 25);
dtSub.Rows.Add(8, "Capsicum", 3, 2534);
dtSub.Rows.Add(9, "Guava", 1, 865);
dtSub.Rows.Add(10, "Goat", 2, 233);
dtSub.Rows.Add(11, "Chilley", 3, 452);
dtSub.Rows.Add(12, "Cheery", 1, 63853);
dtSub.Rows.Add(13, "Cow", 2, 356736);
dtSub.Rows.Add(14, "Donkey", 2, 3456);
dtSub.Rows.Add(15, "Watermelon", 1, 3452);
return dtSub;
}
}
}