← 返回所有博客文章

在区域报表中有子报表(Subreport)的控件:可以显示其它报表的内容

使用到SubReport有三种场景:

  • 一组相关的数据重复(例如,在主报表的订单列表,并在子报表订购的商品)
  • 同报表中使用多个数据源
  • 在报表中创建多个细节部分

下面我们通过一个例子来说明如何在区域报表中,使用子报表:

Step 1: 添加报表控件

2015-02-06_093432

添加2个ActiveReports区域报表(基于代码), 分别命名为rptSimpleMain、rptSimpleSub。

Step2: 设计主报表数据和布局

添加数据源(添加数据源的目的是为了在UI设计报表方便,也可以不添加数据源,运行时通过代码绑定)

image

我们给rptSimpleMain添加一个TextBox按钮,绑定“类别ID”字段,我们希望在主报表绑定类别ID,然后每个类别ID进行子报表数据填充。

rptSimpleMain布局如下所示:

image

为了实现子报表大小自动增长和缩减,需要设置SubReport的属性CanGrow、CanShrink属性。

image

Step 3: 设计子报表数据和布局

在子报表中,添加了一个分组,并在GroupHead添加2个TextBox,分别显示“产品条码”、“产品名称”;然后在Detail区域,添加barcode报表控件用于绑定“产品ID”字段,再添加TextBox用于绑定“产品名称”字段。

 

rptSimpleSub布局如下所示:

image

因为子报表未在设计时绑定数据源,故需要对数据绑定控件的DataField进行手动输入,例如BarCode的DataField字段,我们输入“产品ID”,在运行时我们传入“产品ID”的数据可自动实现绑定:

image

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: 报表运行结果预览

image

 

源码下载: