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事件中,例如

 

private void Port9_ReportEnd(object sender, System.EventArgs eArgs)

         
{

              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事件中,例如

 

private void Port9_ReportEnd(object sender, System.EventArgs eArgs)

         
{

              sub.Document.Dispose();

              sub.Dispose();

              sub 
= null;

}

 

提醒:如果有绑订数据控件放在ReportHeader或者ReportFooter的话,这时在加载报表时,就会报“位置1处没有任何行”的错误,解决方法是:在PageHeader,PageFooter,Detail等部分新增一个以其绑订的字段一样的控件.不知道还有没有其他更好的解决方法。

posted on 2006-12-30 16:45    阅读(2967)  评论(5编辑  收藏  举报