为水晶报表(含子报表)绑定数据

时间:2022-03-26 11:39:25
为水晶报表(含子报表)绑定数据

本Demo为http://topic.csdn.net/u/20111202/11/4965b533-3102-410f-8de0-9a0eedada681.html?55467 提供。

 我们以PUSH模式为例,既是PUSH,就必须先构造出水晶报表“骨架”---数据集,在项目添加一数据集,我这里在数据集里面添加两个DataTable,一个MainTable(主报表用),一个SubTable(子报表用),在MainTable添加两列:ID和Desc,其中ID设为自增列,如图示

为水晶报表(含子报表)绑定数据
在SubTable添加三列:ID、MainID和Desc,其中ID也设为自增列,MainID用来与MainTable的ID关联
数据骨架构造完毕,我们再为项目添加倆RPT文件,显然是一个主表,一个子表,接着我们为报表设定数据源,打开主表RPT模板,在字段资源管理器右击数据库字段,打开数据库专家,为主报表设定数据表,这里仅将MainTable设定为主表数据源,如图示

为水晶报表(含子报表)绑定数据
子表类似,将SubTable设为子表数据源即可。

好,报表骨架已经有了,再来设计模板,我们先设计子报表模板,将SubTable中的MainID/ID/Desc三字段拖放到子表详细资料节,一般情况下,子报表的页脚节用处不大,显示出来反而占空间,所以我们将其抑制显示,子报表最终设计模板如下图所示,很简单吧:)

为水晶报表(含子报表)绑定数据
子报表设计完后,再来设计主报表,也很简单

首先我们将MainTable中的ID/Desc拖放到详细资料节,然后在模板添加一个详细资料节(右击详细资料节选择在下方插入节即可)用来放置子报表对象,在报表空白处点右键->插入->子报表,位置就放在我们刚刚新添加的详细资料b节,此时弹出的插入子报表窗体会自动在项目中选择RPT对象,而且目前我们项目只有主/子报表两个RPT,所以会默认将子报表RPT设为其子报表。回到主报表模板,右击子报表对象->更改子报表链接,将主表ID与子表MainID进行关联,如图示

为水晶报表(含子报表)绑定数据
至此主报表设计完毕,最终设计模板如下图所示

为水晶报表(含子报表)绑定数据
我顺带修改了下ID与Desc字段对象的字体样式,当然设计模板可根据你的实际需要设计,我这边仅仅只是一个Demo
好了,模板设计完毕,进入代码

[csharp] view plaincopyprint?
  1. using System;  
  2. using System.Collections.Generic;  
  3. using System.ComponentModel;  
  4. using System.Data;  
  5. using System.Drawing;  
  6. using System.Linq;  
  7. using System.Text;  
  8. using System.Windows.Forms;  
  9. using CrystalDecisions.CrystalReports.Engine;  
  10.   
  11. namespace ReportDemo  
  12. {  
  13.     public partial class FrmMain : Form  
  14.     {  
  15.         /// <summary>  
  16.         /// 全局水晶报表对象  
  17.         /// </summary>  
  18.         ReportDocument myReport;  
  19.         /// <summary>  
  20.         /// 数据集作为水晶报表“骨架”  
  21.         /// </summary>  
  22.         DataSet1 crDataSet = new DataSet1();  
  23.   
  24.         public FrmMain()  
  25.         {  
  26.             InitializeComponent();  
  27.         }  
  28.         /// <summary>  
  29.         /// 往“骨架”塞数据  
  30.         /// </summary>  
  31.         /// <param name="sender"></param>  
  32.         /// <param name="e"></param>  
  33.         private void FrmMain_Load(object sender, EventArgs e)  
  34.         {  
  35.             /* *说明:自增列无需另外设置值 * * * * * */  
  36.   
  37.             //主表数据  
  38.             crDataSet.MainTable.AddMainTableRow("大类一");  
  39.             crDataSet.MainTable.AddMainTableRow("大类二");  
  40.             crDataSet.MainTable.AddMainTableRow("大类三");  
  41.   
  42.             //子表数据  
  43.             crDataSet.SubTable.AddSubTableRow(1, "小类一");  
  44.             crDataSet.SubTable.AddSubTableRow(1, "小类二");  
  45.             crDataSet.SubTable.AddSubTableRow(2, "小类三");  
  46.             crDataSet.SubTable.AddSubTableRow(2, "小类四");  
  47.             crDataSet.SubTable.AddSubTableRow(2, "小类五");  
  48.             crDataSet.SubTable.AddSubTableRow(2, "小类六");  
  49.             crDataSet.SubTable.AddSubTableRow(3, "小类七");  
  50.             crDataSet.SubTable.AddSubTableRow(3, "小类八");  
  51.             crDataSet.SubTable.AddSubTableRow(3, "小类九");  
  52.         }  
  53.         /// <summary>  
  54.         /// “Report”按钮事件  
  55.         /// </summary>  
  56.         /// <param name="sender"></param>  
  57.         /// <param name="e"></param>  
  58.         private void btnReport_Click(object sender, EventArgs e)  
  59.         {  
  60.             myReport = new CrystalReport1();  
  61.   
  62.             //只需给主报表设定数据源,无需再为子报表设定数据  
  63.             myReport.SetDataSource(crDataSet);  
  64.   
  65.             crystalReportViewer1.ReportSource = myReport;  
  66.         }  
  67.         /// <summary>  
  68.         /// 窗体关闭前删除水晶报表产生的临时文件,避免过多临时文件导致“报表加载失败”  
  69.         /// </summary>  
  70.         protected override void OnFormClosing(FormClosingEventArgs e)  
  71.         {  
  72.             base.OnFormClosing(e);  
  73.   
  74.             myReport.Dispose();  
  75.         }  
  76.     }  
  77. }  

最终运行效果

为水晶报表(含子报表)绑定数据