2 . 需求 :
2-1 . 當程式在執行期間,報表以顯示預設的群組欄位分類顯示,而使用者希望能夠
自定要分類顯示的群組項目。
2-2 . 報表上已規劃3個 欄位 顯示資料庫的資料,使用者希望能夠自行選取要顯示的欄位
請先參考 [CrystalReports]執行期間~動態改變群組 ,此篇將會延續上一篇繼續擴充
1 . 環境 : 同上一篇
2 . 需求 :
2-1 . 當程式在執行期間,報表以顯示預設的群組欄位分類顯示,而使用者希望能夠
自定要分類顯示的群組項目。
2-2 . 報表上已規劃3個 欄位 顯示資料庫的資料,使用者希望能夠自行選取要顯示的欄位
3 . 範例資料 : 同上一篇,參考(圖一)
4 . 報表設計階段畫面 :
4-1 . 選取資料來源 : 同上一篇,參考(圖二)
4-2 . 選取資料表 : 參考(圖三)
4-3 . 規劃並設計報表畫面(參考圖四)
4-3.1 . 建立文字欄位並設定標題。
(圖四)
* 重點設定
4-3.2 . 將目前由 [ 資料庫欄位 ] 拉到細項區塊顯示的欄位,用 [ 公式欄位 ] 代替
在--> 欄位總管窗格 --> 公式欄位 --> 右鍵 --> 新增 ,3個公式欄位
依序設定其 [ 公式欄位 ] 名稱 item1 ,item2 , item3,參考(圖五)
並在新增畫面 [ 使用編輯器 ],會跳到 [ 公式工作區 ] 畫面,請直接關閉而
此 [ 公式欄位 ] 的公式將會在執行期間利用,程式碼動態去完成和改變。
PS : 因為是動態選取欄位顯示,故無法預知使用者所選取的欄位大小,而決定報表 [ 公式欄位 ] 的寬度
方法以下 : 設定 [ 公式欄位 ] --> 自動調大
在報表內設定公式欄位自動增大(參考下圖),報表編輯畫面--> 按住 Ctrl --> 複選公式欄位 -->右鍵
--> 多重物件格式設定 --> 格式編輯器 --> 將自動調大選項打勾
4-3.3 . 設定預設的群組欄位 : 同上一篇(參考圖六)
5 . UI畫面和程式碼
5-1 . UI畫面,主視窗 Form2(設定群組)視窗 ,主要利用 ComBobox 選擇要做為群組分類的欄位,
並將原 Form2 的 Button1,改為呼叫下一步,並顯示 Form3 (設定欄位)視窗
而新稱 Form3 (設定欄位)視窗做為群組欄位選取,報表顯示在 Form1 (參考圖七)。
5-2 . 程式碼階段
主視窗 Form2(設定群組)視窗變更
參考如下完整程式碼
Public Class Form2
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim SetFieldForm As New Form3
SetFieldForm.Show()
End Sub
Private Sub Form2_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
ComboBox1.SelectedIndex = 0
End Sub
End Class
Form3 (設定欄位)視窗
'加入 CrystalReports.Engine 參考
Imports CrystalDecisions.CrystalReports.Engine
Imports CrystalDecisions.Shared
Imports System.Collections
初始值
Private Sub Form3_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Dim oRpt As CrystalReport1 = New CrystalReport1
ListBox1.Items.Clear()
'動態抓取目前報表載入的資料表,所有欄位名稱
For Each FielDef As DatabaseFieldDefinition In oRpt.Database.Tables.Item(0).Fields
'顯示在 ListBox1
ListBox1.Items.Add(FielDef.Name)
Next
End Sub
顯示報表按鈕(Button1)
'顯示報表
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
If ListBox2.Items.Count > 0 Then
'建立新的報表物件
Dim oRpt As CrystalReport1 = New CrystalReport1
If Form2.ComboBox1.SelectedIndex > 0 Then
'設定群組
Dim FieldDef As FieldDefinition '宣告報表欄位定義
'抓取ComBobox1.Text 在符號 [ - ] 之後的字串
Dim GroupStr As String = Strings.Split(Form2.ComboBox1.Text, "-")(1)
'設定 FileDef 所代表的在資料庫內的欄位
FieldDef = oRpt.Database.Tables.Item(0).Fields.Item(GroupStr)
'設定報表群組的欄位定義
oRpt.DataDefinition.Groups.Item(0).ConditionField = FieldDef
End If
For i As Integer = 0 To ListBox2.Items.Count - 1
'設定公式欄位的屬性 Text == 公式欄位的公式字串
oRpt.DataDefinition.FormulaFields.Item(CStr("item" & (i + 1))).Text = "{客戶." & ListBox2.Items(i) & "}"
'在報表編輯畫面拉欄位到細項區塊,會自動在頁首區塊新稱 TextObject
'顯示其所設定的欄位名稱
'依照選取的欄位改變顯示在頁首的 TextObject 字串
CType(oRpt.ReportDefinition.ReportObjects.Item(CStr("Text" & (i + 1))), TextObject).Text = ListBox2.Items(i)
Next
'重新載入報表
Form1.CrystalReportViewer1.ReportSource = oRpt
If Form1.Visible = True Then
Form1.Focus()
Form1.Select()
Else
Form1.Show()
Form1.Select()
End If
Else
MsgBox("請選取要顯示的資料庫欄位 ^@^")
End If
End Sub
* 說明重點
'設定公式欄位的屬性 Text == 公式欄位的公式字串
oRpt.DataDefinition.FormulaFields.Item(CStr("item" & (i + 1))).Text = "{客戶." & ListBox2.Items(i) & "}"
利用在報表設定的公式名稱(item1)(item2)(item3),去存取其欄位的公式 ,並設定其公式
等於 {資料表名稱.欄位名稱}。以顯示欄位,相對何言此處的公式是可以自己組合的範例如下
一個公式欄位顯示 2個資料庫欄位公式 "{客戶.國家} + Chr(13) + Chr(10) + {客戶.地區}"
其餘部份程式碼,在此不多撰述
6 . 執行階段畫面預覽 : (參考圖八~九)
7 . 以上請多指導
8 . 下一篇將會介紹 [Crystal Rpeots] 累加值欄位 代替 群組內 資料錄編號
====================================================
有些事就該把它當作一種回憶...