一、概述
PivotGridControl是DevExpress組件中的一個重要控件,在數據多維分析方面具有強大的功能,它不僅可以分析數據庫中的數據,而且還能夠做聯機分析處理(OLAP),並且支持多種數據倉庫。前面的文章中介紹了如何用PivotGridControl制作交叉表部件,在智能窗體上展示交叉報表。本文將繼續對PivotGridControl控件的應用技巧進行小結。< xmlnamespace prefix ="o" />
二、功能特點
首先通過界面了解PivotGridControl控件的基本概念,下圖是PivotGridControl控件顯示的一個交叉表樣例:
圖1:交叉表界面
區域1、2分別是交叉表的行、列區域,包含行列字段值,及字段標題。通過標題按鈕可以對字段值進行排序、本地過濾等操作。
區域3、4是數據區域,其中白色的單元格是“匯總單元格”,它顯示對數據源的匯總值。黃色單元格為“小計、總計”單元格,進一步統計匯總單元格的值。
區域5是顯示過濾字段的數據篩選區域,過濾字段不屬於交叉表的一部分,專門用於對數據進行本地過濾。
從這個交叉表可以了解到PivotGridControl控件具有以下特點:
1) 可定制的報表
終端用戶能夠定制PivotGridControl的字段。在字段標題上點擊右鍵彈出字段列表框,通過鼠標拖拽增加或減少行、列、數據區域的字段,改變交叉報表的分析方式。
圖2:字段定制
2) 樹形結構的字段值
圖1的行區域有“部門、姓名”2個字段,部門是姓名的上級字段,在部門的字段值上顯示了“展開/折疊按鈕”。例如圖3折疊字段值“兒科”后,數據區域的單元格將以“兒科”小計行的方式顯示。
如果有2個以上的行(列)字段,除了最后一級,其它字段值都可以像樹形節點一樣展開/折疊。
圖3:樹形字段值
3) 本地過濾
界面上顯示的字段標題具有本地過濾的功能。點擊字段標題上的過濾按鈕,可以彈出字段值列表。篩選字段值后,交叉表以此為條件過濾數據源中的數據后再進行匯總。當行、列字段值較多時,終端用戶通過本地過濾減少行列數,只統計出當前關注的數據。
圖4:本地過濾
4) 數據鑽取
通過鑽取單元格可以得到單元格匯總的原始記錄,參見下圖:
圖5:數據鑽取
代碼示例:
在PivotGridControl單元格雙擊事件中,調用了對象的CreateDrillDownDataSource 方法,得到單元格值的詳細記錄。數據鑽取是深入分析數據的必備功能。
三、字段控件屬性
字段控件(PivotGridField)是PivotGridControl中的基本組成元素,以上功能就是控制其字段屬性得以實現的。
屬性名稱 |
意義 |
PivotGridField.Area |
該屬性表示字段當前所在的區域,有{行區域、列區域、數據區域、數據過濾區域}4個單選值。拖拽字段位置后,屬性值也會實時變化。 |
PivotGridField.AllowedArea |
控制字段只能在指定區域中拖動,有{行區域、列區域、數據區域、數據過濾區域}4個多選項。該屬性值應包含“Area”的屬性值。 |
PivotGridField.AreaIndex |
表示字段在同一個區域的排列順序,可以在界面上拖拽動態設置。 |
PivotGridField.Visible |
字段是否可見,不可見的字段可以放到字段列表框備用。 |
PivotGridField.Option.AllowExpand |
字段在行列區域時,字段值是否顯示展開、折疊按鈕。 |
PivotGridField.Option.AllowFilter |
字段標題上是否顯示本地過濾按鈕 |
PivotGridField.SummaryType |
字段的匯總類型:求和、平均值、最大值、最小值、計數。 |
PivotGridField.FieldName |
綁定的業務數據表字段名稱 |
PivotGridField.FieldEdit |
嵌入單元格的編輯控件,用此控件實現交叉表的數據編輯功能。 |
PivotGridField.Width |
通過設置字段標題寬度控制交叉表行、列的寬度。但字段在列區域時,此屬性是無效的,因為列寬是由單元格寬度決定的,而單元格寬度等於數據字段標題寬度。並且從屬於同一個數據字段的所有列寬只能統一設置,無法單獨設置每一列的寬度。 |
除了以上比較重要的屬性,還有排序、圖標、外觀等屬性。
四、應用分析
1. 數據編輯
交叉表除了展示數據分析結果,也可以用於編輯數據。以前的文章介紹了交叉表編輯的應用場景及限制條件,重點是單元格要能夠唯一映射到數據源的原始記錄。
和網格部件類似,單元格的編輯功能都是通過“Embed Editor”實現的,因此可以和網格部件使用相同的字段模型。
但是和網格部件的區別在於,編輯單元格的值后,PivotGridControl是不會自動把單元格輸入的值更新到數據源的。從圖5的數據鑽取結果可知,單元格可能對應多條原始記錄。那么PivotGridControl控件本身就無法決定應該如何更新這些原始記錄,這就需要開發者根據實際的業務需求去手動更新數據源的記錄。所以根據目前的應用場景,規定單元格數據鑽取結果超過1條記錄時就不允許編輯。
2. 顯示多行文本
前面涉及的交叉表例子都是以數字類型的字段作為數據字段。實際上文本類型的字段也可能作為數據字段(參見圖6)。這種交叉表不是為了對文本字段進行統計分析,而是以二維的表結構顯示,使其易於閱讀。
圖6
但是PivotGridControl對多行文本的支持並不理想。雖然可以用多行文本的“Embed Editor”把字段值顯示出來,但顯示出來的結果卻只有一行字符的高度。從字段屬性表可知,字段控件也只能設置其寬度,而沒有設置高度的功能,更不用說像Excel那樣自適應每行高度了。
經過一番搜尋,發現PivotGridControl V11.1中有虛方法“RaiseCustomRowHeignt()”。
該方法的第一個輸入參數表示行區域中將要設置行高的那個單元格,第二個參數為行高。重寫此虛方法即可改寫默認行高。
RaiseCustomRowHeignt 是單獨設置每行高度的,在列寬固定的條件下,只要計算出每行單元格的最長內容,就可以得到每行的最佳高度。
測量字符串顯示尺寸的示例代碼:
使用GDI+的 MeasureString 方法可以測得字符串在指定字體時的顯示尺寸 sizeF。
MeasureString 的第3個參數是可選的,設置一個固定寬度,那么測得的結果就是在考慮自動換行情況下的顯示尺寸。
效果圖預覽:
圖7:多行文本
3. 隱藏字段的2種方法
在字段屬性中有“Visible”控制字段是否顯示,除此之外還可以把字段寬度設為0,實現字段的隱藏。
圖8
參見示例“圖8”,有“日期”行字段。下面分別用2種方式隱藏該字段
方法一:把“日期”字段控件的屬性設為fale,結果見圖9,交叉表的分析字段只包含了“開單人、收費項目”。“日期”字段已經不在交叉表的行區域中了。
圖9
方法二:把“日期”字段控件的寬度“Width”屬性設為0,結果如下:
圖10
與圖8比較可知,交叉表的分析結果與隱藏“日期”字段之前相同。
所以零寬度字段不但可以實現行字段的隱藏,同時還能夠保持交叉表的分析方式不變。用零寬度字段可以實現一些特殊結構的交叉表。
PivotGridControl還有很多有用的功能,目前我們只是用到了其中的一部分,以后有需要再深入學習。