SetParameters傳遞的參數(shù)是Parameters,是 ReportParameter的集合,轉(zhuǎn)換當(dāng)然會(huì)出錯(cuò)
成都創(chuàng)新互聯(lián)堅(jiān)持“要么做到,要么別承諾”的工作理念,服務(wù)領(lǐng)域包括:網(wǎng)站建設(shè)、成都網(wǎng)站建設(shè)、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣等服務(wù),滿足客戶于互聯(lián)網(wǎng)時(shí)代的高陽網(wǎng)站設(shè)計(jì)、移動(dòng)媒體設(shè)計(jì)的需求,幫助企業(yè)找到有效的互聯(lián)網(wǎng)解決方案。努力成為您成熟可靠的網(wǎng)絡(luò)建設(shè)合作伙伴!
可以改為 ReportViewer1.LocalReport.SetParameters(New ReportParameter() {temp})
With Me.ReportViewer1 '初始化報(bào)表
.Dock = DockStyle.Fill
.LocalReport.DataSources.Clear()
.LocalReport.ReportPath = "Report1.rdlc"
.RefreshReport()
End With
報(bào)表在設(shè)計(jì)時(shí),不一定要綁定數(shù)據(jù)源,但在窗體加載時(shí),需要初始化報(bào)表控件,以上代碼可以放在窗體加載的Load事件里,供你參考。
CrystalReportViewer
dataset 定義數(shù)據(jù)源
.rpt 文件描述具體報(bào)表樣式
再加一個(gè)調(diào)用報(bào)表的FORM,就可以實(shí)現(xiàn)簡單的報(bào)表功能
Option Explicit
dim Report as New Cystal1
Private Sub Form_Load()
Screen.MousePointer = vbHourglass
'調(diào)用水晶報(bào)表時(shí)置鼠標(biāo)為沙漏狀 CRViewer91.ReportSource = Report '該語句的賦值將在后面被修改
CRViewer91.ViewReport
Screen.MousePointer = vbDefault '調(diào)用水晶報(bào)表完成后置鼠標(biāo)為默認(rèn)形狀
End Sub
Private Sub Form_Resize()
CRViewer91.Top = 0
CRViewer91.Left = 0
CRViewer91.Height = ScaleHeight
CRViewer91.Width = ScaleWidth
End Sub
Private Sub daywaterlevel_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
'創(chuàng)建一個(gè)內(nèi)含連接信息的數(shù)據(jù)庫鏈接對(duì)象
Dim myConnection As New SqlConnection
myConnection.ConnectionString = "Persist Security Info=False;Integrated Security=SSPI;database=cwfzx;server=yllsony;Connect Timeout=30 "
'定義一個(gè)報(bào)表對(duì)象
Dim myreportDoc As New ReportDocument
Dim myDBConncetionInfo As ConnectionInfo
Dim myTable As Table
'循環(huán)處理Tables集合中的每一個(gè)Table對(duì)象并設(shè)置登陸信息
For Each myTable In myReportDoc.Database.Tables
myDBConncetionInfo = myTable.LogOnInfo.ConnectionInfo()
With myDBConncetionInfo
.ServerName = "yllsony "
.databaseName = "cwfzx "
.UserId = "sa "
.Password = "636490 "
End With
Next
'定義一個(gè)sqldataAdapter類型的變量
Dim MyCommand As SqlDataAdapter
'創(chuàng)建數(shù)據(jù)集對(duì)象
Dim ds As DataSet = New dsDayWater
'創(chuàng)建一個(gè)SqlDataAdapter對(duì)象
MyCommand = New SqlDataAdapter( "select stcd,tm,z from tb_river_r ", myConnection)
'鏈接到數(shù)據(jù)庫,提起數(shù)據(jù),然后中斷鏈接
MyCommand.Fill(ds, "tb_river_r ")
'載入報(bào)表
myReportDoc.Load(Application.StartupPath "\crdaywater.rpt ")
'將數(shù)據(jù)集ds傳遞給報(bào)表對(duì)象
myReportDoc.SetDataSource(ds)
'綁定報(bào)表查看器控件
CrtViewerWater.ReportSource = myReportDoc
End Sub
沒試過封裝DLL。
提供其他的方式:rdlc文件屬性,生成操作:嵌入的資源。
VB.NET的一個(gè)示例代碼:
Me.reportviewer.Reset()
'這個(gè)是相對(duì)路徑調(diào)用的方法Me.reportviewer.LocalReport.ReportPath
=
Application.StartupPath
".\Reports\報(bào)表名.rdlc"
'增加報(bào)表數(shù)據(jù)源
Me.reportviewer.LocalReport.DataSources.Add(New
ReportDataSource("DataSet_IntMater",
DataSet.IntMaterComplain))
'使用嵌入的資源方式調(diào)用報(bào)表
Me.reportviewer.LocalReport.ReportEmbeddedResource
=
"項(xiàng)目名.報(bào)表名.rdlc"
Me.reportviewer.LocalReport.DisplayName
=
"報(bào)表"
Me.reportviewer.RefreshReport()
提供一種方案,使分頁瀏覽的報(bào)表每頁只顯示N條記錄,最后一頁記錄條數(shù)不足N的,用空行補(bǔ)齊。
示例:
記錄共7條,每頁顯示5條記錄:
下載代碼(vs2008,需要安裝AdventureWorks數(shù)據(jù)庫)
原理:
由于表的分組包含“在起始處分頁”和”在結(jié)束處分頁”的功能,所以我們考慮先將數(shù)據(jù)分成若干個(gè)記錄條數(shù)為N的組,
再啟用“在結(jié)束處分頁”的功能。
那么,如何分組呢?考慮記錄的下標(biāo)為 0,1,2,3... 的自然數(shù)序列,用下標(biāo)除以N(設(shè)為3),得到以下數(shù)列:
0 /3 取整:0
1 /3 取整:0
2 /3 取整:0
3 /3 取整:1
4 /3 取整:1
5 /3 取整:1
6 /3 取整:2
所以,我們可以以下標(biāo)除以3的商的整數(shù)值對(duì)數(shù)據(jù)進(jìn)行分組,則每個(gè)分組包含3條數(shù)據(jù)。當(dāng)記錄條數(shù)不能被3整除時(shí),最后一個(gè)分組會(huì)不足3。分組表達(dá)式為 =Int((RowNumber(Nothing) - 1) / N)。
另一個(gè)需要考慮的問題是,最后一個(gè)分組的記錄條數(shù)可能不足N,怎樣以空白行補(bǔ)齊它呢?考慮TableRow.Visibility.Hidden屬性,可通過表達(dá)式設(shè)置它的狀態(tài)。為此,我們?cè)谠敿?xì)信息組內(nèi)額外添加N-1行,如果檢查到當(dāng)前是記錄的最后一組最后一條并且該組記錄條數(shù)不足N時(shí),將Hidden設(shè)為Flase;其它情況為True。
表達(dá)式為=IIf(RowNumber(Nothing) = CountRows("table1") AndAlso CountRows() = r,False,True)。其中r從1開始遞增。
實(shí)現(xiàn):
1.新建WinForm項(xiàng)目,用報(bào)表向?qū)砑右粡垐?bào)表,數(shù)據(jù)源為AdventureWorksDataSet的Employee數(shù)據(jù)庫表,調(diào)整詳細(xì)信息(這里只選擇了表內(nèi)前面7條數(shù)據(jù)):
2.(以下都是在報(bào)表的設(shè)計(jì)模式中)在表內(nèi)添加組,分組表達(dá)式為 =Int((RowNumber(Nothing) - 1) / 3),取消包括組頭和包括組尾,勾選在結(jié)尾處分頁:
3.連續(xù)插入兩行:
4.選擇插入的第一行(TableRow3),在Visibility的Hidden屬性下選擇“表達(dá)式”,在打開的文本框內(nèi)填入
=IIf(RowNumber(Nothing) = CountRows("table1") AndAlso CountRows() = 1, False, True);同理,在插入的第二行(TableRow4)同位置填入
=IIf(RowNumber(Nothing) = CountRows("table1") AndAlso CountRows() = 2, False, True):
5.運(yùn)行程序,可以看到前兩頁分別只有3條記錄,最后一頁1條,空白處用空行補(bǔ)齊了:
以MSServer自帶Northwind庫文件內(nèi)的Customers及Orders這兩個(gè)表為例,建立兩個(gè)報(bào)表文件,在查詢得出Customers的表數(shù)據(jù)后,點(diǎn)擊此表內(nèi)的CustomerID數(shù)據(jù),報(bào)表將轉(zhuǎn)入至下一個(gè)報(bào)表,并顯示與之相關(guān)的Orders的數(shù)據(jù),即VS中所謂的鉆取式報(bào)表。
1、打開一個(gè)工程,并新建一個(gè)From,放入一個(gè)Button及一個(gè)ReportViewer控件。
2、在工程內(nèi)新建一個(gè)數(shù)據(jù)源,連接到Northwind庫文件,顯示Customers及Orders這兩個(gè)表
3、新建一個(gè)報(bào)表文件,并以表格的形式來顯示數(shù)據(jù),將Customers表內(nèi)的CustomerID、CompanyName及Address三個(gè)字段放入,形成一份有表頭及數(shù)據(jù)的簡單報(bào)表,并將此報(bào)表保存命名為customerReport
4、再建一個(gè)報(bào)表文件,與customerReport相同,也以表格的形式來顯示報(bào)表,將Orders內(nèi)的OrderID、CustomerID、ShipName及OrderDate四個(gè)字段放入表格內(nèi),報(bào)表保存為orderReport
5、orderReport的數(shù)據(jù)源根據(jù)主報(bào)表customerReport的數(shù)據(jù)來確定數(shù)據(jù)源的數(shù)據(jù),查看表格的數(shù)據(jù)集名稱,我的顯示為NorthwindDataSet_Orders,也可以自己另建一個(gè),具體方法見我的《RDLC報(bào)表(二)》
6、再打開customerReport報(bào)表,將CustomerID設(shè)置成為可點(diǎn)擊的索引字段,以便轉(zhuǎn)入下一個(gè)報(bào)表。選擇CustomerID字段,按鼠標(biāo)右鍵,在”文本框?qū)傩浴按翱谥?,選擇”導(dǎo)航“選項(xiàng)卡,在下面的”超鏈接“中選擇”跳至報(bào)表“,在報(bào)表名稱中選擇”orderReport“,再按下后面的”參數(shù)...“按鈕,輸入一個(gè)參數(shù)名稱,如customerid,參數(shù)值選擇=Fields!CustomerID.Value。為了與其它數(shù)據(jù)相區(qū)分,可以將此列數(shù)據(jù)根據(jù)自己的習(xí)慣改變顏色或加下劃線
7、在orderReport中,設(shè)置一個(gè)報(bào)表參數(shù),與CurtomerReprot中的名稱相同,以接收父表中傳入的參數(shù)
8、新建兩個(gè)取得數(shù)據(jù)的方法,一個(gè)從Customers中取得數(shù)據(jù)集,另一個(gè)從Orders中取得數(shù)據(jù)集,且?guī)?shù)。此兩個(gè)方法可以自己編寫類庫來實(shí)現(xiàn),也可以在VS的數(shù)據(jù)集內(nèi)添加。為了演示方便,我直接使用了Customers的GetData(),并編寫了一個(gè)Orders的GetDataByCustomerID(@cid)的方法。
9、在From的Button中編寫如下代碼:
private void button2_Click(object sender, EventArgs e)
{
NorthwindDataSet.CustomersDataTable dt1 = new NorthwindDataSetTableAdapters.CustomersTableAdapter().GetData();
this.reportViewer1.LocalReport.ReportEmbeddedResource = "TestReport.customerReport.rdlc";
this.reportViewer1.LocalReport.DataSources.Clear();
this.reportViewer1.LocalReport.DataSources.Add(new ReportDataSource("NorthwindDataSet_Customers", dt1));
this.reportViewer1.RefreshReport();
}
10、使用報(bào)表的Drillthrough事件,當(dāng)選擇了鉆取項(xiàng)時(shí)會(huì)發(fā)生此事件,給下一個(gè)報(bào)表取值,代碼如下:
private void reportViewer1_Drillthrough(object sender, DrillthroughEventArgs e)
{
LocalReport lp = (LocalReport)e.Report;
string customerid = lp.GetParameters()["customerid"].Values[0].Trim();
lp.DataSources.Clear();
lp.DataSources.Add(new ReportDataSource("NorthwindDataSet_Orders",
new NorthwindDataSetTableAdapters.OrdersTableAdapter().GetDataByCustomerID(customerid)));
}