首先查看了DataDynamics.ActiveReports自带的SubReport的示例项目。它是将子报表放在原报表的明细中,其实我试过也可以把子报表放在报表头或报表尾。关键是在定义子报表是要将子报表的报表头和报表尾删除掉换成分组。我想这是因为在同一个报表中只能定义一个报表头和报表尾的缘故,如果子报表也这样定义也许会有冲突。
下面就把制作子报表的简要步骤列举如下:
首先制作一个报表,并使其能够正常预览。然后在设计视图的工具箱中拖放一个Subreport的控件到报表上,可以放在报表的任何部分。然后重命名这个子报表。
接下来,在这个报表的相关部分的Format事件中添加初始化子报表的代码。例如:这时子报表放在报表头那么就应该在报表头的Format事件中添加代码,如下所示。
using DataDynamics.ActiveReports;
using DataDynamics.ActiveReports.Document;
using DataDynamics.ActiveReports.DataSources;
// 父报表
public class MyActiveReport : ActiveReport
{
//创建一个需要在子报表中显示的已有报表类的实例
rptSubReport _SubReport = null;
// 其他代码省略
private void PageHeader_Format(object sender, System.EventArgs eArgs)
{
if (_SubReport == null)
{
SqlDBDataSource subDs = new SqlDBDataSource(); // 声明ActiveReports数据源
subDs.ConnectionString = cnnString; // 给这个数据源指定连接字符串
subDs.SQL = "select * from table1 "; // 指定查询语句
_SubReport = new rptSubReport(); // 实例化预定义报表实例
this.SubReport.Report = _SubReport; // 给子报表指定预定义报表实例
this.SubReport.Report.DataSource = subDs; // 给子报表指定ActiveReports数据源
}
}
}
最好在父报表中加上“using DataDynamics.ActiveReports.DataSources;” 这样就可以直接使用DataDynamics.ActiveReports.DataSources的数据源类。ActiveReports的数据源支持SQL 和OLEDB可以根据需要选择。
洪虎
2006-10-28