[分享]为水晶报表(含子报表)绑定数据

阿双2009 2011-12-03 02:55:41
本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
好了,模板设计完毕,进入代码

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using CrystalDecisions.CrystalReports.Engine;

namespace ReportDemo
{
public partial class FrmMain : Form
{
/// <summary>
/// 全局水晶报表对象
/// </summary>
ReportDocument myReport;
/// <summary>
/// 数据集作为水晶报表“骨架”
/// </summary>
DataSet1 crDataSet = new DataSet1();

public FrmMain()
{
InitializeComponent();
}
/// <summary>
/// 往“骨架”塞数据
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void FrmMain_Load(object sender, EventArgs e)
{
/* *说明:自增列无需另外设置值 * * * * * */

//主表数据
crDataSet.MainTable.AddMainTableRow("大类一");
crDataSet.MainTable.AddMainTableRow("大类二");
crDataSet.MainTable.AddMainTableRow("大类三");

//子表数据
crDataSet.SubTable.AddSubTableRow(1, "小类一");
crDataSet.SubTable.AddSubTableRow(1, "小类二");
crDataSet.SubTable.AddSubTableRow(2, "小类三");
crDataSet.SubTable.AddSubTableRow(2, "小类四");
crDataSet.SubTable.AddSubTableRow(2, "小类五");
crDataSet.SubTable.AddSubTableRow(2, "小类六");
crDataSet.SubTable.AddSubTableRow(3, "小类七");
crDataSet.SubTable.AddSubTableRow(3, "小类八");
crDataSet.SubTable.AddSubTableRow(3, "小类九");
}
/// <summary>
/// “Report”按钮事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btnReport_Click(object sender, EventArgs e)
{
myReport = new CrystalReport1();

//只需给主报表设定数据源,无需再为子报表设定数据
myReport.SetDataSource(crDataSet);

crystalReportViewer1.ReportSource = myReport;
}
/// <summary>
/// 窗体关闭前删除水晶报表产生的临时文件,避免过多临时文件导致“报表加载失败”
/// </summary>
protected override void OnFormClosing(FormClosingEventArgs e)
{
base.OnFormClosing(e);

myReport.Dispose();
}
}
}

最终运行效果
...全文
480 8 打赏 收藏 举报
写回复
8 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
cy_nobuda 2013-01-18
是我搞错了,设计子表的时候错了一个地方,现在好了。
  • 打赏
  • 举报
回复
cy_nobuda 2013-01-18
lz,求助,为什么照着你的方法做下来,我的子报表都只显示一列呢?而且不是对应的,就只显示了小类123
  • 打赏
  • 举报
回复
yangguosheng 2011-12-16
C# 中怎么取“子报表连接啊”?
还有一个问题,报表中有多个表连接,foreach便利连接时,不管便利到哪个连接了,总是访问一个连接的信息,是不是bug啊,还是我取错了,明天到公司再把代码贴出来。
  • 打赏
  • 举报
回复
yangguosheng 2011-12-16
上边错别字一大堆。重来吧

C# 中怎么取“子报表连接啊”?
还有一个问题,报表中有多个表连接,foreach遍历连接时,不管遍历到哪个连接了,总是访问第一个连接的信息,是不是bug啊,还是我取错了,明天到公司再把代码贴出来。


foreach(CrystalDesisions.CrystalReports.Engine.TableLink link in reportdocument.Database.Links)
{
link.DestinationFields[0]//这里就不明白了,为什么一个连接的DestinationFields会是多个字段。
}
  • 打赏
  • 举报
回复
勿勿 2011-12-05
谢谢了,把demo发到我邮箱来好吗 szstephenzhou@163.com 多谢
结贴了
  • 打赏
  • 举报
回复
阿双2009 2011-12-05
[Quote=引用 3 楼 szstephenzhou 的回复:]
谢谢了,把demo发到我邮箱来好吗 szstephenzhou@163.com 多谢
结贴了
[/Quote]

Demo本身其实没什么意义,关键还是结合你自己的需要去动手实践

邮件已发
  • 打赏
  • 举报
回复
发帖
图表区

4810

社区成员

.NET技术 图表区
社区管理员
  • 图表区社区
加入社区
帖子事件
创建了帖子
2011-12-03 02:55
社区公告
暂无公告