ActiveReports 7中所提供的区域报表拥有极强的定制能力,可以在设计时和运行时完成对报表元素的定制操作。比如:在运行时根据用户的权限动态的显示或隐藏部分数据,根据各个数据之间的关系控制其它控件显示的数据。本例主要演示了在运行时动态隐藏客户订单明细报表中第一页之后所有页页眉中显示的内容,第一页需要显示客户名称、住所、交货日期和金额,第一页之后的页眉中只需要显示交货日期。

首先,在VS中创建一个桌面应用程序,并在工程中添加一个ActiveReports 7 基于代码的区域报表模板。

image

然后,在报表中添加相应的控件完成报表基本布局的设计,得到以下结果:

image

最后,我们在pageHeader和detail的Format事件中根据业务逻辑完成对报表布局的动态调整

pageHeader_Format方法中我需要根据当前的页号,对页眉中控件的显示/隐藏状态进行调整,主要代码如下:

    private void pageHeader_Format(object sender, EventArgs e)
    {
        // 没有开始时,将当前页已经显示的数据行数归零
        rowcount = 0;
        // 如果不是第一页,就隐藏页眉中的部分控件
        if (pagecount > 0)
        {
            // 第一页之后,每页可以打印9行数据
            MaxRows = 9;
            #region 第一页之后,隐藏部分控件
            lRow3.Location = lRow1.Location;
            tRow3.Location = tRow1.Location;
            lRow1.Visible = false;
            lRow2.Visible = false;
            lRow4.Visible = false;
            tRow1.Visible = false;
            tRow2.Visible = false;
            tRow4.Visible = false;
            lHeader1.Location = new PointF(lHeader1.Location.X, lRow3.Location.Y + lRow3.Height);
            lHeader2.Location = new PointF(lHeader2.Location.X, lRow3.Location.Y + lRow3.Height);
            lHeader3.Location = new PointF(lHeader3.Location.X, lRow3.Location.Y + lRow3.Height);
            lHeader4.Location = new PointF(lHeader4.Location.X, lRow3.Location.Y + lRow3.Height);
            lHeader5.Location = new PointF(lHeader5.Location.X, lRow3.Location.Y + lRow3.Height);
            #endregion
        }
        pagecount += 1;
    }

然后在detail_Format放中根据当前所显示的数据行数,决定是否需要换页,详细代码如下:

    private void detail_Format(object sender, EventArgs e)
    {
        rowcount += 1;
        // 根据当前打印的数据行数觉得是否换页
        if (rowcount == MaxRows)
            detail.NewPage = GrapeCity.ActiveReports.SectionReportModel.NewPage.After;
        else
            detail.NewPage = GrapeCity.ActiveReports.SectionReportModel.NewPage.None;
    }

最后在窗体中设置报表数据源并显示报表:

    private void Form1_Load(object sender, EventArgs e)
    {
        System.Data.DataTable dt = new DataTable();
        dt.Columns.Add("Code");
        dt.Columns.Add("Name");
        dt.Columns.Add("Count");
        dt.Columns.Add("Price");
        dt.Columns.Add("Sum");
        for (int i = 1; i <= 23; i++)
        {
            dt.Rows.Add(i, "商品" + i.ToString(), 1, 1, 1);
        }
        SectionReport1 rpt = new SectionReport1();
        rpt.DataSource = dt;
        rpt.Run();
        viewer1.Document = rpt.Document;
    }

运行截图,第一页显示了客户名称、住所、交货日期和金额,以及6行详细数据;第二页显示了交货日期和9行详细数据

image

源码下载:VS2010 + ActiveReports 7