




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、动态水晶报表:任意表,任意列,以及动态格线 分类: 水晶报表内功心法CR编程开发2009-04-08 02:58487人阅读评论(1)收藏举报有很多很多次被问到:为什么水晶报表那么麻烦,每做一张报表都要选表,画线画格子,有没有一种方法可以一劳永逸?做一个模板,然后用不同的表都能用?还有就是能不能动态选择列,而且选择列后能报表能自动适用这个变化?甚至有些人也因为放弃了水晶报表,实际上这些都是水晶报表可以做到的。我之前曾零散地写过几篇,在论坛和博客中都曾反复讲解过思路,但是并没有系统地去解决这个问题,在这里,我来讲解一下原理和实现。希望该文章,能基本上解决这个问题。当然,这个也不是万能的,也有其适
2、用环境。本文开发环境:VS2005 / CR XI R2 for .Net第一步:新建一个C#的水晶报表的WinForm空白项目。在弹出报表数据源选择框的时候,不要选择任何任何数据源,直接点确定,创建一个空白报表。第二步:项目中添加一个Dataset1.xsd,手工建立一个DataTable,命名为BigTable。建立6个字段,全部为String型。为什么用6个呢?这个数字6的确立,是根据你的实际需要,这个表的列的数目,需要大于等于你所需要操作的事实表的最大列数。用为什么用String型呢?我们知道基本上所有的基础数据类型都可以转换为String,这样我们的这个表基本上可以容纳所有的数据类型
3、。好了,在报表中添加这个Bigtable.将6个字段拖到详细资料节。对齐。()注意!不要使用框和线来画格子,这里用的是字段边框,初次操作可以暂时不用,我后面会专门讲一下这个格线的处理。好了,这样我们的万能模板就做成了。很简单,是吗?呵呵。第三步:在winform上拖上一个combox,一个button,用默认名称接口。combox1用来选表的名称。这样界面也完成了。第四步:实现原理上面的几步下来,有经验的朋友基本上看出来我们是要用PUSH模式来实现了。既然我们已经在报表里用到了BigTable,那么我们要传递给报表的数据,也就要整形成BigTable的样子。也就是说,只要能把来源数据表的数据,
4、整形成BigTable的样子,就能用这一个模板显示出来。而不用管来源表从哪里来,表名是什么,有几个字段(但是字段数目需要小于等于6),字段名是什么,有多少数据。从而达到万能的目的。我把这个工作简单封装了一下,做了个小方法。class clsDyCrystalReportCore/ <summary>/ 将传入的datatable转换成报表模板所需要的datatable/ 数据全部转换为string/ </summary>/ <param name="dt">来源表</param>/ <returns>报表模板所需要
5、的datatable</returns>public DataTable dtx(DataTable dt)DataSet1.BigTatableDataTable dtx1 = new DataSet1.BigTatableDataTable(); object obj = new objectdt.Columns.Count;/特别注意:所选择的表的列的数目需<=Bigtable的字段数目/请自行填写保护代码for (int i = 0; i <dt.Rows.Count ; i+)dtx1.Rows.Add(dtx1.NewRow();for (int j = 0
6、; j < dt.Columns.Count ; j+)dtx1.Rowsij = dt.Rowsij.ToString(); return dtx1;就是来源表按照BigTable的结构写到BigTable里面去。很简单的代码,但也是这个方案的核心。第五步:功能实现。1 using System;2 using System.Collections.Generic;3 using System.ComponentModel;4 using System.Data;5 using System.Text;6 using System.Windows.Forms;7 using Cryst
7、alDecisions.Shared;8 using CrystalDecisions.CrystalReports.Engine;9 using CrystalDecisions.Windows.Forms;10 using System.Data.OleDb;11 namespace DyCrystalReportDemo12 13 public partial class Form1 : Form14 15 public Form1()16 17 InitializeComponent();18 19 20 private void button1_Click(object sender
8、, EventArgs e)21 22 String tblName = comboBox1.Text ;23 String connstr = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + System.Threading.Thread.GetDomain().BaseDirectory+ "bbtcrall.mdb" + ""24 25 if (tblName = "")26 27 MessageBox.Show("请选择表名");28
9、comboBox1.Focus();29 return;30 31 32 /打开数据库连接33 34 DataTable dt1 = new DataTable();35 DataTable dtx = new DataTable();36 OleDbDataAdapter da = new OleDbDataAdapter();37 OleDbConnection cn = new OleDbConnection(connstr);38 39 /打开选择的表(注意进行错误保护)40 41 /如果要实现任意列,只要更改此处的SQL为具体的字段即可42 da = new OleDbDataAda
10、pter("SELECT * From " + tblName, cn);43 da.Fill(dt1);44 45 /处理ds146 clsDyCrystalReportCore xCore = new clsDyCrystalReportCore();47 dtx = xCore.dtx(dt1);48 49 ReportDocument myReport = new ReportDocument();50 string reportPath = System.Threading.Thread.GetDomain().BaseDirectory + "crys
11、talreport1.rpt"51 myReport.Load(reportPath);52 53 /绑定数据集,注意,一个报表用一个数据集。54 55 myReport.SetDataSource(dtx);56 57 crystalReportViewer1.ReportSource = myReport;58 crystalReportViewer1.RefreshReport();59 60 61 private void Form1_Load(object sender, EventArgs e)62 63 comboBox1.Items.Add ("Test1_
12、1");64 comboBox1.Items.Add ("Test1_2"); 65 66 67 其他:1:稍晚些我会把格线的处理完善一下2:动态实现也可以使用开发版或水晶报表2008用API添加,但是要比这个麻烦多了。3:本例子不适用于大数据量操作。本文适用场景:出于显示效果或者打印节约纸张等的需要,将多个不同结构(设置来源于不同数据源)的表在同一个报表中展现。一般我们可以通过子报表来实现这个效果。不过一般一个子报表对应一个表,这样对于多个表操作起来就比较麻烦。每个表都要做一个子报表,对于动态取表(表数目,表名称)的要求也满足不了。虽然也可以借助SDK,对不同的表,动态增加一个子报表,但是代码量很大。基本思路:既然我们延续上文的原理,那么本方案的主要问题就是,如何把这任意多的表,塞到同一个datatable 里去1:我们同样要构造一个datatable来容纳我们的表数据。假设我们的表的最大列数是6,那么我们需要创建一个7个列的datatable。为什么上文是6个,这里要7个呢?多出来的的这个字段f0,我们用来放表的名称。这样来区分数据是来源于哪个表的。这样我们就创建了f0,f1f6,
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 二零二五年度个人担保个人住房贷款合同
- 二零二五年度信用卡委托代理服务合同补充协议
- 二零二五年度房屋转租租赁双方责任合同
- 二零二五年度体育赛事联合组织与推广合同
- 二零二五年度店铺转让及知识产权保护协议格式
- 二零二五年度娱乐行业音乐制作公司词曲创作劳动合同
- 2025年度洗浴中心员工培训与晋升合同
- 2025年度跨境电商债权转让与物流服务合同
- 2025年度果树种植土地托管承包与农村劳动力转移就业协议
- 二零二五年度多式联运运输合同特征与物流信息化
- 生命在你手中-交通安全
- 河北省唐山市2025年中考历史一模模拟试题(含答案)
- 生物信息学第三讲基因功能富集分析
- 中职高教版(2023)语文职业模块-第五单元:走近大国工匠(二)学习工匠事迹 领略工匠风采【课件】
- 2024年山东省济南市中考地理试题卷(含答案解析)
- DB31∕T 795-2014 综合建筑合理用能指南
- GB/T 44979-2024智慧城市基础设施紧凑型城市智慧交通
- 2025年保密知识试题库附参考答案(精练)
- 临床微生物学检验技术知到智慧树章节测试课后答案2024年秋济宁医学院
- 分级护理质量考核标准
- 食品厂卫生安全员工培训
评论
0/150
提交评论