6水晶报表简单制作步骤

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
这样界面也完成了。 第四步:实现原理 上面的几步下来,有经验的朋友基本上看出来我们是要用 PUSH 模式来实现了。 既然我们已经在报表里用到了 BigTable,那么我们要传递给报表的数据,也就要整形成 BigTable 的样子。 也就是说,只要能把来源数据表的数据,整形成 BigTable 的样子,就能用这一个模板显示出来。 而不用管来源表从哪里来,表名是什么,有几个字段(但是字段数目需要小于等于 6),字段名是什么,有多少数据。 从而达到万能的目的。 我把这个工作简单封装了一下,做了个小方法。
在出来的界面上就可以看到对象的名称
ReportObjects 就是我们前面所指的报表对象集合,单一对象就是一个 ReportObject 对于 ReportObject 来说,通用的属性有这样一些
一般我们可以控制对象的位置,通过控制左上角的坐标,也就是 top 和 left 属性。 这里说一下水晶报表的坐标系和计量单位。 水晶报表的坐标系,以每个节的左上角为原点,往下往右两个方向递增延展。 计量单位是缇,与厘米的换算关系是:1 厘米=567 缇 所以在后面的代码中,你会看到我有这样的写法: 567*N 其实也就是 N 厘米。 另外还有 ObjectFormat 下面的属性,可以控制对象的隐藏与显示,这个很实用吧,呵呵。
5 using System.Text;
6 using System.Windows.Forms;
7 using CrystalDecisions.Shared;
8 using CrystalDecisions.CrystalReports.Engine;
9 using CrystalDecisions.Windows.Forms;
你没填充数据怎么会有数据,你在数据集里拖出来的 表只是一个表结构
DataSet1 ds = new DataSet1();
conn))
using (SqlConnection conn = new SqlConnection(conString)) {
using (SqlDataAdapter adpt = new SqlDataAdapter("select * from MedicionType",
class clsDyCrystalReportCore { /// <summary> /// 将传入的 datatable 转换成报表模板所需要的 datatable /// 数据全部转换为 string /// </summary> /// <param name="dt">来源表</param> /// <returns>报表模板所需要的 datatable</returns> public DataTable dtx(DataTable dt) { DataSet1.BigTatableDataTable dtx1 = new DataSet1.BigTatableDataTable(); object[] obj = new object[dt.Columns.Count]; //特别注意:所选择的表的列的数目需<=Bigtable 的字段数目 //请自行填写保护代码
//PULL 或 PUSH 方式的数据处理 //... CrystalReportViewer1.ReportSource = myReport;
//然后,才是下文中的代码
关于水晶报表里的对象,我们直观的来看一下。 在模板空白处点邮件,选“插入”,鼠标放到“特殊字段”上,不要点,会出现如下菜单。
上面这些,都是报表对象或说是报表部件。恩,这些我们都可以进行控制。 操作的基本语法是:
就是来源表按照 BigTable 的结构写到 BigTable 里面去。很简单的代码,但也是这个方案的核心。 第五步:功能实现。
1 using System;
2 using System.Collections.Generic;
3 using System.ComponentModel;
4 using System.Data;
先说一下,操作对象,是依靠 ReportDocument, 基础代码如下:
C# code
ReportDocument myReport = new ReportDocument(); string reportPath = Server.MapPath("crystalreport1.rpt"); myReport.Load(reportPath);
10 using System.Data.OleDb;
11 namespace DyCrystalReportDemo
12 {
13
public partial class Form1 : Form
14
{
15
public Form1()
16
{
源自文库
17
InitializeComponent();
18
}
19
20
47
dtx = xCore.dtx(dt1);
48
49
ReportDocument myReport = new ReportDocument();
50
string reportPath = System.Threading.Thread.GetDomain().BaseDirectory +
"crystalreport1.rpt";
{ adpt.Fill(ds, "表名,必须和你的数据集里拖出来的一样");
}
}
CrystalReport1 cys = new CrystalReport1(); cys.SetDataSource(ds); this.crystalReportViewer1.ReportSource = cys;
为什么水晶报表那么麻烦,每做一张报表都要选表,画线画格子,有没有一种方法可以一劳永逸? 做一个模板,然后用不同的表都能用? 还有就是能不能动态选择列,而且选择列后能报表能自动适用这个变化? 甚至有些人也因为放弃了水晶报表,实际上这些都是水晶报表可以做到的。 在这里,我来讲解一下原理和实现。 希望该文章,能基本上解决这个问题。当然,这个也不是万能的,也有其适用环境。 本文开发环境:VS2005 / CR XI R2 for .Net 第一步:新建一个 C#的水晶报表的 WinForm 空白项目。在弹出报表数据源选择框的时候,不要选择任何任何数据 源,直接点确定,创建一个空白报表。 第二步:项目中添加一个 Dataset1.xsd,手工建立一个 DataTable,命名为 BigTable。建立 6 个字段,全部为 String 型。 为什么用 6 个呢?这个数字 6 的确立,是根据你的实际需要,这个表的列的数目,需要大于等于你所需要操作的事实 表的最大列数。 用为什么用 String 型呢?我们知道基本上所有的基础数据类型都可以转换为 String,这样我们的这个表基本上可以 容纳所有的数据类型。 好了,在报表中添加这个 Bigtable.
tem.Threading.Thread.GetDomain().BaseDirectory+ "bbtcrall.mdb" + ";";
24
25
if (tblName == "")
26
{
27
MessageBox.Show("请选择表名");
28
comboBox1.Focus();
29
return;
class Db { private SqlConnection con; private static string sconn = @"连接 SQL 的字符串"; public DataSet GetDataset(string sql) //返回数据集 { this.Open(); SqlCommand cmd = new SqlCommand(sql, con); SqlDataAdapter sda = new SqlDataAdapter(cmd); DataSet ds = new DataSet(); sda.Fill(ds); this.Close(); return ds; }
38
39
//打开选择的表(注意进行错误保护)
40
41
//如果要实现任意列,只要更改此处的 SQL 为具体的字段即可
42
da = new OleDbDataAdapter("SELECT * From " + tblName, cn);
43
da.Fill(dt1);
44
45
//处理 ds1
46
clsDyCrystalReportCore xCore = new clsDyCrystalReportCore();
51
myReport.Load(reportPath);
52
53
//绑定数据集,注意,一个报表用一个数据集。
54
55
myReport.SetDataSource(dtx);
56
57
crystalReportViewer1.ReportSource = myReport;
58
crystalReportViewer1.RefreshReport();
for (int i = 0; i <dt.Rows.Count ; i++) {
dtx1.Rows.Add(dtx1.NewRow());
for (int j = 0; j < dt.Columns.Count ; j++) {
dtx1.Rows[i][j] = dt.Rows[i][j].ToString(); } } return dtx1; } }
将 6 个字段拖到详细资料节。对齐。()
注意!不要使用框和线来画格子,这里用的是字段边框,初次操作可以暂时不用,我后面会专门讲一下这个格线的处理。 好了,这样我们的万能模板就做成了。很简单,是吗?呵呵。
第三步:在 winform 上拖上一个 combox,一个 button,用默认名称接口。 combox1 用来选表的名称。
59
}
60
61
private void Form1_Load(object sender, EventArgs e)
62
{
63
comboBox1.Items.Add ("Test1_1");
64
comboBox1.Items.Add ("Test1_2");
65
}
66
}
67 }
2.SQL 语句没有问题,表里也有数据 ,运行没提示错误,那位大哥帮我看下,不知道哪里出了问题 我写了个数据库的连接类(补充的字有限,还有个关闭和打开的连接没列出)
private void button1_Click(object sender, EventArgs e)
21
{
22
String tblName = comboBox1.Text ;
23
String connstr = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + Sys
myReport.ReportDefinition.ReportObjects[对象序号].方法或属性; //或 myReport.ReportDefinition.ReportObjects[对象名称].方法或属性;
对象序号在 .Net 的水晶报表版本里很难直观的看出来,一般他是按加入报表的顺序来排的 这个很难去记住。有时候为了一些需要,在遍历的时候会用的到。 一般我们会用名称。 在对象上点右键,设置对象格式,
} 在窗体的加载事件如下:
private void Form1_Load(object sender, EventArgs e)//窗体加载 { CrystalReport1 rpMember = new CrystalReport1(); DataSet dszy = new Db().GetDataset("SQL 语句"); rpMember.SetDataSource(dszy); crystalReportViewer1.ReportSource = rpMember; }
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);
相关文档
最新文档