動(dòng)態(tài)水晶報(bào)表.doc_第1頁(yè)
動(dòng)態(tài)水晶報(bào)表.doc_第2頁(yè)
動(dòng)態(tài)水晶報(bào)表.doc_第3頁(yè)
動(dòng)態(tài)水晶報(bào)表.doc_第4頁(yè)
動(dòng)態(tài)水晶報(bào)表.doc_第5頁(yè)
已閱讀5頁(yè),還剩2頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

動(dòng)態(tài)水晶報(bào)表:任意表,任意列,以及動(dòng)態(tài)格線 分類: 水晶報(bào)表內(nèi)功心法CR編程開發(fā)2009-04-08 02:58487人閱讀評(píng)論(1)收藏舉報(bào)有很多很多次被問到:為什么水晶報(bào)表那么麻煩,每做一張報(bào)表都要選表,畫線畫格子,有沒有一種方法可以一勞永逸?做一個(gè)模板,然后用不同的表都能用?還有就是能不能動(dòng)態(tài)選擇列,而且選擇列后能報(bào)表能自動(dòng)適用這個(gè)變化?甚至有些人也因?yàn)榉艞壛怂?bào)表,實(shí)際上這些都是水晶報(bào)表可以做到的。我之前曾零散地寫過幾篇,在論壇和博客中都曾反復(fù)講解過思路,但是并沒有系統(tǒng)地去解決這個(gè)問題,在這里,我來講解一下原理和實(shí)現(xiàn)。希望該文章,能基本上解決這個(gè)問題。當(dāng)然,這個(gè)也不是萬(wàn)能的,也有其適用環(huán)境。本文開發(fā)環(huán)境:VS2005 / CR XI R2 for .Net第一步:新建一個(gè)C#的水晶報(bào)表的WinForm空白項(xiàng)目。在彈出報(bào)表數(shù)據(jù)源選擇框的時(shí)候,不要選擇任何任何數(shù)據(jù)源,直接點(diǎn)確定,創(chuàng)建一個(gè)空白報(bào)表。第二步:項(xiàng)目中添加一個(gè)Dataset1.xsd,手工建立一個(gè)DataTable,命名為BigTable。建立6個(gè)字段,全部為String型。為什么用6個(gè)呢?這個(gè)數(shù)字6的確立,是根據(jù)你的實(shí)際需要,這個(gè)表的列的數(shù)目,需要大于等于你所需要操作的事實(shí)表的最大列數(shù)。用為什么用String型呢?我們知道基本上所有的基礎(chǔ)數(shù)據(jù)類型都可以轉(zhuǎn)換為String,這樣我們的這個(gè)表基本上可以容納所有的數(shù)據(jù)類型。好了,在報(bào)表中添加這個(gè)Bigtable.將6個(gè)字段拖到詳細(xì)資料節(jié)。對(duì)齊。()注意!不要使用框和線來畫格子,這里用的是字段邊框,初次操作可以暫時(shí)不用,我后面會(huì)專門講一下這個(gè)格線的處理。好了,這樣我們的萬(wàn)能模板就做成了。很簡(jiǎn)單,是嗎?呵呵。第三步:在winform上拖上一個(gè)combox,一個(gè)button,用默認(rèn)名稱接口。combox1用來選表的名稱。這樣界面也完成了。第四步:實(shí)現(xiàn)原理上面的幾步下來,有經(jīng)驗(yàn)的朋友基本上看出來我們是要用PUSH模式來實(shí)現(xiàn)了。既然我們已經(jīng)在報(bào)表里用到了BigTable,那么我們要傳遞給報(bào)表的數(shù)據(jù),也就要整形成BigTable的樣子。也就是說,只要能把來源數(shù)據(jù)表的數(shù)據(jù),整形成BigTable的樣子,就能用這一個(gè)模板顯示出來。而不用管來源表從哪里來,表名是什么,有幾個(gè)字段(但是字段數(shù)目需要小于等于6),字段名是什么,有多少數(shù)據(jù)。從而達(dá)到萬(wàn)能的目的。我把這個(gè)工作簡(jiǎn)單封裝了一下,做了個(gè)小方法。class clsDyCrystalReportCore/ / 將傳入的datatable轉(zhuǎn)換成報(bào)表模板所需要的datatable/ 數(shù)據(jù)全部轉(zhuǎn)換為string/ / 來源表/ 報(bào)表模板所需要的datatablepublic DataTable dtx(DataTable dt)DataSet1.BigTatableDataTable dtx1 = new DataSet1.BigTatableDataTable(); object obj = new objectdt.Columns.Count;/特別注意:所選擇的表的列的數(shù)目需=Bigtable的字段數(shù)目/請(qǐng)自行填寫保護(hù)代碼for (int i = 0; i dt.Rows.Count ; i+)dtx1.Rows.Add(dtx1.NewRow();for (int j = 0; j dt.Columns.Count ; j+)dtx1.Rowsij = dt.Rowsij.ToString(); return dtx1;就是來源表按照BigTable的結(jié)構(gòu)寫到BigTable里面去。很簡(jiǎn)單的代碼,但也是這個(gè)方案的核心。第五步:功能實(shí)現(xiàn)。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 DyCrystalReportDemo12 13 public partial class Form1 : Form14 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(請(qǐng)選擇表名);28 comboBox1.Focus();29 return;30 31 32 /打開數(shù)據(jù)庫(kù)連接33 34 DataTable dt1 = new DataTable();35 DataTable dtx = new DataTable();36 OleDbDataAdapter da = new OleDbDataAdapter();37 OleDbConnection cn = new OleDbConnection(connstr);38 39 /打開選擇的表(注意進(jìn)行錯(cuò)誤保護(hù))40 41 /如果要實(shí)現(xiàn)任意列,只要更改此處的SQL為具體的字段即可42 da = new OleDbDataAdapter(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 + crystalreport1.rpt;51 myReport.Load(reportPath);52 53 /綁定數(shù)據(jù)集,注意,一個(gè)報(bào)表用一個(gè)數(shù)據(jù)集。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_1);64 comboBox1.Items.Add (Test1_2); 65 66 67 其他:1:稍晚些我會(huì)把格線的處理完善一下2:動(dòng)態(tài)實(shí)現(xiàn)也可以使用開發(fā)版或水晶報(bào)表2008用API添加,但是要比這個(gè)麻煩多了。3:本例子不適用于大數(shù)據(jù)量操作。本文適用場(chǎng)景:出于顯示效果或者打印節(jié)約紙張等的需要,將多個(gè)不同結(jié)構(gòu)(設(shè)置來源于不同數(shù)據(jù)源)的表在同一個(gè)報(bào)表中展現(xiàn)。一般我們可以通過子報(bào)表來實(shí)現(xiàn)這個(gè)效果。不過一般一個(gè)子報(bào)表對(duì)應(yīng)一個(gè)表,這樣對(duì)于多個(gè)表操作起來就比較麻煩。每個(gè)表都要做一個(gè)子報(bào)表,對(duì)于動(dòng)態(tài)取表(表數(shù)目,表名稱)的要求也滿足不了。雖然也可以借助SDK,對(duì)不同的表,動(dòng)態(tài)增加一個(gè)子報(bào)表,但是代碼量很大?;舅悸罚杭热晃覀冄永m(xù)上文的原理,那么本方案的主要問題就是,如何把這任意多的表,塞到同一個(gè)datatable 里去1:我們同樣要構(gòu)造一個(gè)datatable來容納我們的表數(shù)據(jù)。假設(shè)我們的表的最大列數(shù)是6,那么我們需要?jiǎng)?chuàng)建一個(gè)7個(gè)列的datatable。為什么上文是6個(gè),這里要7個(gè)呢?多出來的的這個(gè)字段f0,我們用來放表的名稱。這樣來區(qū)分?jǐn)?shù)據(jù)是來源于哪個(gè)表的。這樣我們就創(chuàng)建了f0,f1f6,共7個(gè)String行的

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論