动态水晶报表:任意表,任意列 之 动态格线实现
在前文《动态水晶报表:任意表,任意列,以及动态格线》中,
有一个地方还没有完全实现。就是根据内容自动调整表头的列,跟内容表格相对应。
我们也注意到了,在前文中,后面的列之所以不显示,不是因为它们没有了,它们是存在的,只是内容是空(''),注意是空,不是空格。
依此延伸开来,表头也可以用此原理来实现。
本文接上文,稍加改动
把原来的表头删除,放上6个参数字段,p1,p2...p6,都设置边框。设置好与字段的对齐。
然后,改进一下窗体的代码即可。
2 using System.Collections.Generic;
3 using System.ComponentModel;
4 using System.Data;
5 using System.Text;
6 using System.Windows.Forms;
7 using CrystalDecisions.Shared;
8 using CrystalDecisions.CrystalReports.Engine;
9 using CrystalDecisions.Windows.Forms;
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 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=" + System.Threading.Thread.GetDomain().BaseDirectory+ "bbtcrall.mdb" + ";";
24
25 if (tblName == "")
26 {
27 MessageBox.Show("请选择表名");
28 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 OleDbDataAdapter("SELECT * From " + tblName, cn);
43 da.Fill(dt1);
44
45 //根据dtl获得实际列数
46 int cols = dt1.Columns.Count;
47
48
49 //处理ds1
50 clsDyCrystalReportCore xCore = new clsDyCrystalReportCore();
51 dtx = xCore.dtx(dt1);
52
53 ReportDocument myReport = new ReportDocument();
54 string reportPath = System.Threading.Thread.GetDomain().BaseDirectory + "crystalreport1.rpt";
55 myReport.Load(reportPath);
56
57 //绑定数据集,注意,一个报表用一个数据集。
58
59 myReport.SetDataSource(dtx);
60
61 //设置参数,即表头
62 for (int i = 1; i <= 6; i++)
63 {
64 if (i <= cols)
65 myReport.SetParameterValue("p" + i.ToString(), "列名" + i.ToString());
66 else
67 //注意,这个不能省,一定要给没用到的参数一个空值
68 myReport.SetParameterValue("p" + i.ToString(), "");
69 }
70 crystalReportViewer1.ReportSource = myReport;
71 //crystalReportViewer1.RefreshReport();
72 }
73
74 private void Form1_Load(object sender, EventArgs e)
75 {
76 comboBox1.Items.Add ("Test1_1");
77 comboBox1.Items.Add ("Test1_2");
78 }
79
80 private void crystalReportViewer1_Load(object sender, EventArgs e)
81 {
82
83 }
84 }
85 }
86
不好意思,偷懒了,没对齐。
稍加说明:
1: //根据dtl获得实际列数
int cols = dt1.Columns.Count;
2: //设置参数,即表头
for (int i = 1; i <= 6; i++)
{
if (i <= cols)
myReport.SetParameterValue("p" + i.ToString(), "列名" + i.ToString());
else
//注意,这个不能省,一定要给没用到的参数一个空值
myReport.SetParameterValue("p" + i.ToString(), "");
}
3://crystalReportViewer1.RefreshReport();
这个要注意,这里注释掉了,因为每次刷新的时候,参数窗口会重新弹出来。
所以要使用参数功能的话,尽量把toolbar上的刷新按钮禁止掉。防止出问题。