ActiveReport子报表(For .Net)
如何在ActiveReport显示主从表中的数据呢?使用子报表能够提供很大的灵活性,一般就是主要的信息显示在detail中,但是如果一些报表的Title内容是动态获取的,这时就需要绑订数据。一般要每页的上方都要显示Title就可以放在PageHeader中,只要首页显示的话放在ReportHeader。再把子表的信息放在Detail中。下面要讲的内容都是数据源为有主从关系的DataSet。
第一种报表如下所示,明细部分只是单纯的显示,不需要另外的处理
其中填报单位等信息,是主表的内容,码头泊位信息、总计、出港、进港为明细表内容。该报表的做法是:
1. 新建报表然后在工具箱上可以看到SubReport控件,拖放一个控件到Detail部分,用此控件来加载子报表。
2. 再新建一个报表,命名为SubReport1 ,接下来在主报表中写代码,在页面设计器上选中Detail部分,在属性窗口切换到事件栏,双击Format,将会产生Detail_Format事件,下面就要在这个事件里指定子报表控件所要加载的报表。
ActiveReport sub = null;
private void Detail_Format(object sender, System.EventArgs eArgs)
{
if(sub == null)
{
sub = new SubReport();
sub.DataSource = this.DataSource;
sub.DataMember = "Detail";
this.SubReport1.Report = sub;
}
}
3. 还有要注意的一点是,在使用完子报表后要将其释放,销毁掉,具体的代码放在主报表的ReportEnd事件中,例如
{
sub.Document.Dispose();
sub.Dispose();
sub = null;
}
第二种报表如下所示,明细部分又有不同的分类。
其中填报单位、装(卸)货港作为主表的内容,货物分类、总计等其他信息作为明细表的内容,并且主从表于装(卸)货港关联。
其做法是:
1. 新建报表后,请切插入分组,DataField设为装(卸)货港。
2. 然后在工具箱上可以看到SubReport控件,拖放一个控件到Detail部分,用此控件来加载子报表。
3. 再新建一个报表,命名为SubReport1 ,接下来在主报表中写代码,在页面设计器上选中Detail部分,在属性窗口切换到事件栏,双击Format,将会产生Detail_Format事件,下面就要在这个事件里指定子报表控件所要加载的报表。
ActiveReport sub = null;
private void Detail_Format(object sender, System.EventArgs eArgs)
{
//取得当前分组后,当前组的值(装(卸)港值)。
string strValue = txbSerial.Value.ToString();
sub = new SubReport();
//根据当前组(装(卸)港值)的值对应的货类信息,绑订到子报表
DataView dv = ((DataSet) this.DataSource).Tables["Detail"].DefaultView;
dv.RowFilter = "Serial = '" + strValue + "'";
sub.DataSource = dv;
this.SubReport1.Report = sub;
}
4. 在使用完子报表后要将其释放,销毁掉,具体的代码放在主报表的ReportEnd事件中,例如
{
sub.Document.Dispose();
sub.Dispose();
sub = null;
}
提醒:如果有绑订数据控件放在ReportHeader或者ReportFooter的话,这时在加载报表时,就会报“位置1处没有任何行”的错误,解决方法是:在PageHeader,PageFooter,Detail等部分新增一个以其绑订的字段一样的控件.不知道还有没有其他更好的解决方法。