• 2019-1-17为水晶报表(含子报表)绑定数据


    我们以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();
            }
        }
    }
    

      
    最终运行效果

  • 相关阅读:
    【flutter学习】基础知识(一)
    【软件测试学习】 敏捷开发(二)
    【软件测试学习】 软件测试初步认识(一)
    【hugo】- hugo 监听浏览器切换title
    【hugo】- hugo 博客 添加鼠标单击特效
    春风十里
    一眼就能看懂的C#委托、多播委托和事件的区别与联系。
    js控制的DataGrid的URL参数不能动态刷新表格的问题
    [报错解决].net web api测试页面ajax 报错400 的问题
    [MVC]使用jquery.form.js 异步上传文件
  • 原文地址:https://www.cnblogs.com/liuqifeng/p/10282655.html
Copyright © 2020-2023  润新知