动态水晶报表:任意表,任意列 之 动态格线实现

在前文《动态水晶报表:任意表,任意列,以及动态格线》中,
有一个地方还没有完全实现。就是根据内容自动调整表头的列,跟内容表格相对应。

我们也注意到了,在前文中,后面的列之所以不显示,不是因为它们没有了,它们是存在的,只是内容是空(''),注意是空,不是空格。
依此延伸开来,表头也可以用此原理来实现。

本文接上文,稍加改动
把原来的表头删除,放上6个参数字段,p1,p2...p6,都设置边框。设置好与字段的对齐。

然后,改进一下窗体的代码即可。

 

 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 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上的刷新按钮禁止掉。防止出问题。

 

posted @ 2009-05-20 00:33  阿泰  阅读(5187)  评论(3编辑  收藏  举报