CH10
報表設計
報表設計 使用報表功能 過去微軟提出了相當多的報表建置工具,從VB6.0時代,微軟也持續的與Crystal Report廠商合作,在Visual Studio系列產品當中提供了Crystal Report報表建置的功能。除此之外,SQL Server的Reporting Services,也讓程式設計師有著更簡易的報表製作功能。 有別於這些選擇,Visual Studio 2005提供了新版的報表功能,透過『用戶端報表定義檔案(.rdlc)』,讓開發人員可以輕鬆的在不需要外掛其他功能或是購買使用授權的狀況底下,即可開發出具有報表功能的應用程式。 與Crystal Report相同,這個功能並不包含在Visual Basic Express版本當中,您必須具有Visual Studio 2005正式版本才可享用此功能。
報表設計 報表機制的使用架構
報表設計 在專案中加入報表
報表設計 在專案中加入報表 會在專案當中看到一個副檔名為.rdlc的報表定義檔案:
報表設計 加入資料來源 報表的資料來源多半是資料庫,因此我們得先設定這個報表的資料來源:
報表設計 加入資料來源
報表設計 加入資料來源 Visual Studio 2005會自動找到專案中可用的資料來源,並且提供我們選擇:
報表設計 加入資料來源 接著出現底下畫面,您可以在底下畫面中選擇資料來源cNorthWind.Mdf當中所有可用的資料表(Table)或是檢視表(View) 展開『資料表』之後,選擇『供應商』。
報表設計 加入資料來源 完成之後,Visual Studio 2005為我們在專案中建立了一個.xsd檔案: 『資料來源』處出現了供應商
報表設計 開始設計報表 請在方案總管當中切換到Report1.rdlc檔案,並且開啟『工具箱』視窗: 『工具箱』中的控制項變成報表定義檔可以使用的項目。
報表設計 開始設計報表 請在方案總管當中切換到Report1.rdlc檔案,並且開啟『工具箱』視窗: 您可以拖曳一個TextBox 到頁面上,請注意,這個TextBox與一般我們在表單當中使用的TextBox完全不同,請勿混淆。該TextBox的屬性也與表單TtextBox不同。
報表設計 開始設計報表 透過屬性視窗,修改這個TextBox的文字格式與大小,並且填入文字:
報表設計 開始設計報表 接著,我們要在報表加入『資料欄位』,以呈現出資料庫中的結果。請先從工具箱中拖曳一個Table控制項:
報表設計 開始設計報表 Table當中有三個Row,第一個是呈現出頁首部分,第二個則是細目資料,第三各則是報表頁尾。一般的報表都會有這三個部分,其中細目資料的部分,會一直重複顯示,顯示的次數依照資料庫中紀錄的數量而定。 報表頁首 報表細目資料 報表頁尾
報表設計 開始設計報表 我們將左方的『工具箱』切換成『資料來源』,並且直接拖曳『供應商編號』到第一個欄位: 請注意要拖曳到細目部份。
報表設計 開始設計報表 您可以視需要新增Table中的欄位,方法很簡單,只需要點選Column處,按下滑鼠右鍵即可:
報表設計 開始設計報表 可以透過屬性視窗修改報表中的欄位格式:
報表設計 開始設計報表 請點選Table頁首部分的最左方標示,並將屬性視窗中的RepeatOnNewPage設為True:
報表設計 如何在表單中顯示報表 要在表單中顯示剛才設計好的報表,請先切換回到表單的部份,從工具箱中拖曳ReportViewer控制項到表單上: 從工具箱中拖曳ReportViewer控制項到表單上 透過SmartTag設定該控制項的顯示報表為剛才我們建立好的Report1
報表設計 如何在表單中顯示報表 完成之後,您可以直接建置專案並且執行,您會發現一個有模有樣的報表已然完成:
報表設計 以參數動態填入文字欄位 切換回報表設計畫面,在『報表定義檔案』的設計模式下,點選功能表中的『報表報表參數』,會出現底下的視窗,您可以按下加入鈕,會出現一個新的參數(預設名稱為Report_Parameter_0) : 您可以修改參數的名稱與型別。 請按下加入鈕,會建立出一個新的參數
報表設計 以參數動態填入文字欄位 到『報表定義檔案』設計模式當中,接著請再拖曳TextBox到報表上:
報表設計 以參數動態填入文字欄位 在屬性視窗中設定TextBox的Value屬性:
報表設計 以參數動態填入文字欄位 選擇『運算式』之後,會出現底下這個『編輯運算式』視窗,請選擇『參數』項目,即可把剛才建立的參數填入TextBox中:
報表設計 以參數動態填入文字欄位 接著我們回到表單程式碼部分,請切換至Form1_Load程式碼,您會發現在Form1的Load事件當中,已經有兩行Visual Studio 2005自動為我們加入的程式碼: EX: CH10\ReportDemo\Form1.vb Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load 'TODO: 這行程式碼會將資料載入 'cNorthWindDataSet.供應商' 資料表。您可以視需要進行移動或移除。 Me.供應商TableAdapter.Fill(Me.cNorthWindDataSet.供應商) Me.ReportViewer1.RefreshReport() End Sub
報表設計 以參數動態填入文字欄位 請修改為: EX:CH10\ReportDemo\Form1.vb 0000: Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load 0001: 'TODO: 這行程式碼會將資料載入 'cNorthWindDataSet.供應商' 資料表。您可以視需要進行移動或移除。 0002: Me.供應商TableAdapter.Fill(Me.cNorthWindDataSet.供應商) 0003: 0004: '定義兩個參數(陣列形式 0-1) 0005: Dim paras(1) As Microsoft.Reporting.WinForms.ReportParameter 0006: '分別設定這兩個參數的值 0007: paras(0) = New Microsoft.Reporting.WinForms.ReportParameter("Report_Parameter_UserName", "製表人:David") 0008: paras(1) = New Microsoft.Reporting.WinForms.ReportParameter("Report_Parameter_CreateDT", "列表時間:" & Now.ToString) 0009: '透過SetParemeters將參數填入報表中 0010: Me.ReportViewer1.LocalReport.SetParameters(paras) 0011: Me.ReportViewer1.RefreshReport() 0012: End Sub 請注意,參數名稱,必須完全等於剛才我們在報表中建立的參數名稱。
報表設計 以參數動態填入文字欄位 報表列印出來之後,果然出現我們想要的結果: 這兩個報表TextBox欄位,其內容是報表參數,而參數值則被程式碼中所填入報表的參數值替換了。 報表列印出來之後,果然出現我們想要的結果:
報表設計 動態篩選資料內容 請在表單上,額外佈置一個TextBox和一個Button: 填入SQL語法來動態篩選資料用。
報表設計 動態篩選資料內容 請在篩選鈕的Click事件當中,建立底下的程式碼,1-7行是我們介紹過的參數處理方式: EX:CH10\ReportDemo\Form1.vb 0000: Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click 0001: '定義兩個參數(陣列形式 0-1) 0002: Dim paras(1) As Microsoft.Reporting.WinForms.ReportParameter 0003: '分別設定這兩個參數的值 0004: paras(0) = New Microsoft.Reporting.WinForms.ReportParameter("Report_Parameter_UserName", "製表人:David") 0005: paras(1) = New Microsoft.Reporting.WinForms.ReportParameter("Report_Parameter_CreateDT", "列表時間:" & Now.ToString) 0006: '透過SetParemeters將參數填入報表中 0007: Me.ReportViewer1.LocalReport.SetParameters(paras) 0008: 0009: '動態抓取資料 0010: Dim db As New DbAccess("cNorthWind.MDF") 0011: Dim dt As DataTable = db.GetDataTable(Me.txb_SQL.Text) 0012: '將動態抓取的資料填入報表中,作為資料來源 0013: Me.ReportViewer1.LocalReport.DataSources(0).Value = dt 0014: Me.ReportViewer1.RefreshReport() 0015: End Sub
報表設計 動態篩選資料內容 請在篩選鈕的Click事件當中,建立底下的程式碼,1-7行是我們介紹過的參數處理方式: EX:CH10\ReportDemo\Form1.vb 0000: Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click (…略…) 0009: '動態抓取資料 0010: Dim db As New DbAccess("cNorthWind.MDF") 0011: Dim dt As DataTable = db.GetDataTable(Me.txb_SQL.Text) 0012: '將動態抓取的資料填入報表中,作為資料來源 0013: Me.ReportViewer1.LocalReport.DataSources(0).Value = dt 0014: Me.ReportViewer1.RefreshReport() 0015: End Sub 我們透過第八章介紹過的DbAccess類別來抓取資料,在第11行將使用者輸入在TextBox當中的SQL指令碼傳入執行,回傳的結果會以DataTable形式呈現,我們將結果保留在dt物件中。 接著將dt(DataTable)填入ReportViewer中作為報表的資料來源(第13行),並在第14行重新顯示報表內容。
報表設計 動態篩選資料內容 呈現出來的資料就會是即時篩選之後的結果: 呈現出來的資料是篩選後的結果(僅出現台北縣市的廠商)