水晶报表很强大啊!
去年就搞过,但是由于当时知道的东西太少,对于数据绑定的机制理解的太浅,最后也没弄出个所以然。最近看到别人做的成果之后才坚定这个信念,CrystalReports可以实现很复杂的报表!煤矿行业的报表很复杂不是吗,用CrystalReports来解决吧!这里练习了一下CrystalReports的使用。
看看煤矿储量管理的一张报表,啊,真的很复杂啊!
图1
仔细分析,其中有一部分(红色框表示)是可以作为一张子表显示的。模拟这个子表,首先定义一个类Res,很简单,就几个属性字段。
View Code
1 namespace 水晶报表练习
2 {
3 class Res
4 {
5 double x;
6
7 public double X
8 {
9 get { return x; }
10 set { x = value; }
11 }
12 double y;
13
14 public double Y
15 {
16 get { return y; }
17 set { y = value; }
18 }
19 double x1;
20
21 public double X1
22 {
23 get { return x1; }
24 set { x1 = value; }
25 }
26 double y1;
27
28 public double Y1
29 {
30 get { return y1; }
31 set { y1 = value; }
32 }
33 double x2;
34
35 public double X2
36 {
37 get { return x2; }
38 set { x2 = value; }
39 }
40 double y2;
41
42 public double Y2
43 {
44 get { return y2; }
45 set { y2 = value; }
46 }
47 }
From窗体From的代码如下:
View Code
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 System.Collections;
10 using CrystalDecisions.CrystalReports.Engine;
11
12 namespace 水晶报表练习
13 {
14 public partial class Form1 : Form
15 {
16 public Form1()
17 {
18 InitializeComponent();
19 }
20 private ArrayList stockValues;
21 private ReportDocument stockObjectsReport;
22 private void Form1_Load(object sender, EventArgs e)
23 {
24 stockValues=new ArrayList();
25 //string reportPath =Application.StartupPath+"\\CrystalReport1.rpt";
26 //string reportPath = @"..\..\CrystalReport2.rpt";
27
28 stockObjectsReport = new ReportDocument();
29 // stockObjectsReport.Load(reportPath);
30
31 for (int i = 1; i < 5; i++)
32 {
33 Res m_Res = new Res();
34 m_Res.X = 100*i;
35 m_Res.Y = 2;
36 m_Res.X1 = 10;
37 m_Res.X2 = 12;
38 m_Res.Y1 = 4;
39 m_Res.Y = 5;
40 stockValues.Add(m_Res);
41 }
42
43 //stockObjectsReport.SetDataSource(stockValues);
44 string reportPath2 = @"..\..\CrystalReport3.rpt";
45
46 ReportDocument subReport = new ReportDocument();
47 stockObjectsReport.Load(reportPath2);
48 subReport=stockObjectsReport.OpenSubreport("CrystalReport2.rpt");
49 subReport.SetDataSource(stockValues);
50 crystalReportViewer1.ReportSource = stockObjectsReport;
51 }
52 }
53 }
水晶报表设计器中首先要设置纸张,接下来主要就是绘制线形成表格。下面打开字段资源管理器,选择数据库专家,将自己新建的Res的.Net对象添加到选定表。
在子表设计器中通过组专家设置组字段。这里数据的显示主要依靠组和字段,结果见下图4。在主表中右键单击选择插入子表,我这里选择子表数据从已有的建立,当然也可以建立新的啦!
图2
图3
图4
最后是模拟结果: