在区域报表中有子报表(Subreport)的控件:可以显示其它报表的内容
使用到SubReport有三种场景:
- 一组相关的数据重复(例如,在主报表的订单列表,并在子报表订购的商品)
- 同报表中使用多个数据源
- 在报表中创建多个细节部分
下面我们通过一个例子来说明如何在区域报表中,使用子报表:
Step 1: 添加报表控件
添加2个ActiveReports区域报表(基于代码), 分别命名为rptSimpleMain、rptSimpleSub。
Step2: 设计主报表数据和布局
添加数据源(添加数据源的目的是为了在UI设计报表方便,也可以不添加数据源,运行时通过代码绑定)
我们给rptSimpleMain添加一个TextBox按钮,绑定“类别ID”字段,我们希望在主报表绑定类别ID,然后每个类别ID进行子报表数据填充。
rptSimpleMain布局如下所示:
为了实现子报表大小自动增长和缩减,需要设置SubReport的属性CanGrow、CanShrink属性。
Step 3: 设计子报表数据和布局
在子报表中,添加了一个分组,并在GroupHead添加2个TextBox,分别显示“产品条码”、“产品名称”;然后在Detail区域,添加barcode报表控件用于绑定“产品ID”字段,再添加TextBox用于绑定“产品名称”字段。
rptSimpleSub布局如下所示:
因为子报表未在设计时绑定数据源,故需要对数据绑定控件的DataField进行手动输入,例如BarCode的DataField字段,我们输入“产品ID”,在运行时我们传入“产品ID”的数据可自动实现绑定:
Step 4:添加进行数据关联子报表
数据关联主要在rptSimpleMain中进行,需要响应下面3个报表事件:
- rptSimpleMain_ReportStart
用在运行时,初始化子报表,给主报表绑定数据源和数据字段。
- rptSimpleMain_FetchData
用于在运行时获得主报表的数据绑定的内容
- Detail_Format
用户动态绑定子报表内容,如通过类别ID动态绑定对应的产品数据。
完整的代码如下:
rptSimpleSub rpt;public rptSimpleMain()
{InitializeComponent();}string m_categoryID;
private void rptSimpleMain_FetchData(object sender, FetchEventArgs eArgs){m_categoryID = Fields["类别ID"].Value.ToString();
}private void Detail_Format(object sender, EventArgs e){GrapeCity.ActiveReports.Data.OleDBDataSource subDS = new GrapeCity.ActiveReports.Data.OleDBDataSource();
subDS.ConnectionString = ((GrapeCity.ActiveReports.Data.OleDBDataSource)(this.DataSource)).ConnectionString;
subDS.SQL = "Select * from 产品 where 类别ID = " + m_categoryID;
rpt.DataSource = subDS;ctlSubreport.Report = rpt;}private void rptSimpleMain_ReportStart(object sender, EventArgs e){rpt = new rptSimpleSub();
GrapeCity.ActiveReports.Data.OleDBDataSource _dS = new GrapeCity.ActiveReports.Data.OleDBDataSource();
_dS.ConnectionString = MainFrm.GetConnectionString();_dS.SQL = "Select distinct 类别ID from 产品";
this.DataSource = _dS;
}
Step 5: 报表运行结果预览
源码下载: