天天看點

ASP.NET中實時圖表的實作

  在對大批量的資料進行分析比較時,最常用也是最直覺明了的表現方法莫過于繪制趨勢圖表。一般情況下,我們利用EXCEL制作各種類型的趨勢圖表,但它們都是基于靜态資料的,即資料是事先整理好的而不 是動态生成的。如果在網上釋出,隻能将繪制好的圖表以靜态GIF圖像釋出,這無法從根本上滿足不同使用者對不同資料的需求。

ASP擅長伺服器端的Web程式設計,操作背景資料庫更是它的強項。但是用ASP制作實時資料庫圖表有點困難,因為ASP本身并不支援圖表功能,隻能借助第三方控件進行開發,如VB的MSChart控件。微軟推出的.NET Framework較好地解決了這個問題。微軟在.NET平台上內建了實時資料庫圖表制作元件—OWC(Microsoft Office Web Components)。通過在ASP.NET頁面中調用OWC,我們可以輕松地繪制出各種類型的實時圖表。OWC支援近50種圖表類型,包括曲線圖、折線圖、柱狀圖、面積圖、K線圖等。與MSChart相比,OWC功能強大,操作簡單。此外,由于OWC是基于服務端的,而MSChart隻能應用在用戶端,是以在伺服器端的Web開發中,MSChart要比OWC遜色不少。

下面筆者将結合執行個體來具體闡述OWC在ASP.NET頁面中的應用,這個執行個體是筆者開發的項目《化纖産品及其原料市場分析系統》中的一個子系統,筆者在該項目中用到OWC,充分享受到了OWC的強大功能給開發工作帶來的友善。

三層結構

系統整體架構采用了B/S三層結構模式,将系統分為使用者界面層(也稱為表現層)、業務邏輯層(也稱為功能層)和資料庫服務層(也稱為資料層),開發平台則采用了.NET Framework,有效地降低了系統對客戶機的要求,避免了在客戶機上分發應用程式與版本控制的困難。

● 使用者界面層: 使用者界面采用的是ASP.NET技術。ASP.NET技術的應用增強了系統的通用性,用戶端隻需安裝IE或Netscape等任一款浏覽器,無需加載任何元件。

● 業務邏輯層: 采用了.NET Framework調用OWC的技術,能夠根據使用者的要求快速取得資料庫中的資料動态生成圖表。系統能夠支援複雜的檢索條件,檢索速度快,響應時間短。

● 資料庫服務層:資料庫服務層可采用任何一款關系型資料庫。在本項目中,筆者使用的是SQL Server,它能與.NET Framework無縫內建。資料庫存取技術則采用了ADO.NET。

下文我們将着重介紹業務邏輯層的實作方法。

圖表元素簡介

一張完整的圖表由若幹個元素組成,我們必須對它們有所了解,才能随心所欲、充分自如地對圖表進行全方位的控制,也才能更好地了解本程式。筆者制作了一張簡易的圖表,在圖中标注了程式涉及到的主要部位和元素的名稱,借此幫助讀者掌握OWC以及了解本文所引用的代碼。

ASP.NET中實時圖表的實作

使用OWC元件

在這一節裡所涉及的源代碼摘自于《化纖産品及其原料市場分析系統》,該系統在Window 2000/XP簡體中文專業版、.NET Framewrok 1 .0環境下通過。使用OWC元件的步驟如下:

1. 在目前目錄中建立一個存放圖表檔案的子目錄chart,同時把對該目錄的“修改”權限賦予ASP.NET賬戶。具體步驟如下:用滑鼠右鍵單擊chart目錄名,選擇“屬性”菜單項,在彈出的“Chart”屬性對話框中單擊“安全”頁籤,再單擊“添加”按鈕,找到ASP.NET賬戶,賦予“修改”權限,單擊“确定”按鈕結束。這樣,ASP.NET就可以在chart目錄中寫入圖表檔案了。

2. 定義一個伺服器端的Image圖像控件,該圖像的屬性imageURL将在程式末尾被指向動态生成的圖表檔案,是以在這裡無需為它指派。

< asp:image id=“imgChart” Width=“500” Height=“300” Visible=“False” Runat=“server”>< /asp:image>

3. 添加OWC引用。

在使用OWC之前,首先必須将OWC的引用加入到“解決方案資料總管”中。具體步驟如下:打開“解決方案資料總管”面闆,滑鼠右鍵單擊“引用”,選擇“添加引用”菜單,在彈出的“添加引用”對話框中單擊“COM”卡片,找到“Microsoft Office Web Components 9.0”,單擊“選擇”和“确定”按鈕,OWC就被添加到了引用中。

4. 定義OWC空間,并在該空間中加入一個OWC圖表owcChart。

Dim owcChartSpace As OWC.ChartSpace = New OWC.ChartSpace()

Dim owcChart As OWC.WCChart = owcChartSpace.Charts.Add

5. 用SQL檢索條件進行資料庫檢索,并将檢索結果以RecordSet資料集的方式賦給owcChart。

OWC隻支援RecordSet資料集,不支援DataSet資料集,是以在檢索時不能使用sqlCommand、sqlDataAdapter等對象,隻能使用RecordSet對象進行檢索。

’打開connection連接配接

ConnADO.Open(connectionString)

RecordsetADO.ActiveConnection = ConnADO

’設定遊标為靜态遊标

RecordsetADO.CursorType = ADODB.CursorTypeEnum.adOpenStatic

RecordsetADO.CursorLocation = ADODB.CursorLocationEnum.adUseClient

’變量strSQL中存放了标準SQL檢索條件

RecordsetADO.Open(strSQL)

然後将RecordSet資料集賦給OWC對象:

owcChartSpace.DataSource = RecordsetADO

在本例中,我們假定用SQL語句檢索出的資料共有三個字段:産品、日期和價格。這三個字段的值分别與圖表中的曲線、分類(X)軸和數值(Y)軸的資料一一對應。

6. 确定曲線類型,并确定差別不同曲線的字段名。

首先确定曲線類型為平滑曲線。

owcChart.Type = OWC.ChartChartTypeEnum.chChartTypeSmoothLine

OWC支援在同一張圖表中顯示兩條以上的曲線。是以我們必須給出差別不同曲線的依據,這個依據就是“産品”字段的取值。具體地說,“産品”字段中有幾個不同的取值,就會生成幾條不同的曲線。

owcChart.SetData(OWC.ChartDimensionsEnum.chDimSeriesNames, 0, “産品”)

7. 确定分類(X)軸标簽與數值(Y)軸标簽所對應的字段。

首先需要定義owcSeries為OWC的曲線集合,然後周遊圖表中的每一條曲線,将“日期”字段的值賦給分類(X)軸作為X軸刻度标簽,将“價格”字段的值賦給數值(Y)軸作為Y軸刻度标簽。如果我們能夠确定圖表中隻有一條曲線,也可以省略周遊的過程,但這樣無疑會降低程式的通用性。

Dim owcSeries As OWC.WCSeries

For Each owcSeries In owcChart.SeriesCollection

owcSeries.SetData(OWC.ChartDimensionsEnum.chDimCategories, 0, “日期”)

owcSeries.SetData(OWC.ChartDimensionsEnum.chDimValues, 0, “價格”)

Next

8. 對坐标軸的屬性進行設定。

這部分代碼通過對坐标軸标題的文字内容、顔色、大小、主要和次要刻度線及其标簽、主要和次要網絡線等方面的設定美化圖表。讀者如果對本段代碼中的概念有些模糊,可以參考前一部分提供的那張圖表。具體設定方法請參見以下代碼。

’先定義axis為坐标軸集合

Dim axis As OWC.WCAxis

’周遊坐标軸集合

For Each axis In owcChart.Axes

’顯示軸标題

axis.HasTitle = True

’先對分類(X)軸進行設定

If axis.Type=OWC.ChartAxisTypeEnum.

chCategoryAxis Then

axis.HasTickLabels = True

’顯示X軸刻度标簽

axis.Position = OWC.ChartAxisPositionEnum.chAxisPositionBottom

’标簽的顯示位置

axis.Title.Font.Color =”blue”

’X軸的标題文字顔色

axis.Title.Font.Size = “9”

’X軸的标題文字大小

axis.Title.Caption = “日期範圍”

’X軸的标題文字内容

Else

’對數值(Y)軸進行設定

axis.MajorGridlines.Line.Color = “silver”

’Y軸主要網絡線的顔色

axis.MajorTickMarks = OWC.ChartTickMarkEnum.chTickMarkNone

’不顯示Y軸主要刻度标記

axis.HasTickLabels = True

’顯示Y軸刻度标簽

axis.Title.Font.Color = “blue”

’Y軸的标題文字顔色

axis.Title.Font.Size = “9”

’Y軸的标題文字大小

axis.Title.Caption=“價格(千元/噸)”

’Y軸的标題文字内容

End If

Next

9. 以GIF圖像格式輸出圖表,并将圖像檔案名賦給Image控件。

’用随機數來生成随機檔案名

Randomize()

Dim nFileNameSuffix As Integer

Dim sFileNameSuffix As String

nFileNameSuffix = 100000 * Rnd()

sFileNameSuffix = System.Convert.ToString(nFileNameSuffix)

’以GIF格式輸出圖表,大小為500*300,圖表的檔案名為:polyesterprice_随機數.gif,存放在chart子目錄中

owcChartSpace.ExportPicture(MapPath(“chart/PolyesterPrice_”) + sFileNameSuffix + “.gif”, “gif”, 500, 300)

’将Image控件的URL指向該圖表檔案

imgChart.ImageUrl=“chart/PolyesterPrice_” + sFileNameSuffix + “.gif”

通過以上九個步驟,我們就完成了一個實時資料庫圖表的生成與顯示。在此需要指出的是,以上的九個步驟隻是生成一張圖表必不可少的基本過程,通過設定OWC的其他屬性可以更好、更精确地控制圖表的生成與顯示方式,如圖例、線條的粗細與顔色、坐标軸刻度線及标簽的顯示頻度、網絡線等。這部分筆者不再介紹,請參見本文第四部分的源代碼。

本文代碼生成的圖表效果請見下圖。

ASP.NET中實時圖表的實作

優化

上文中所有實時生成的圖表檔案都存放在chart檔案夾中,由于采用了随機檔案名的方式,是以這些檔案不會互相覆寫。但是如此日積月累,越來越多的檔案不僅占用了硬碟空 間,也妨礙了管理,降低了性能。我們能不能在程式中自動删除以前的圖表檔案呢?答案是肯定的。我們隻要在代碼檔案的Page_Load()函數中放置如下一段代碼,程式運作的時候,就會自動删除當日以前的檔案。這樣,chart檔案夾中存放的就總是當日生成的圖表檔案,進而有效地避免了檔案垃圾。

’先取得chart檔案夾中的檔案清單

Dim fileEntries() As String = System.IO.Directory.GetFiles(MapPath(“chart”))

Dim sFile As String

’周遊檔案清單

For Each sFile In fileEntries

’将檔案的生成日期與系統日期相比,如果是當日以前生成的檔案,删除它

If DateTime.Compare(System.IO.File.GetCreationTime(sFile).AddDays(1), DateTime.Now) < 0 Then

System.IO.File.Delete(sFile)

End If

Next

雖然用OWC生成的圖表功能齊全,界面美觀,但它也存在着不少的缺陷。首先,OWC不支援DataSet資料集,這樣我們就無法在生成圖表的同時使用DataGrid顯示資料表,除非我們用循環依次取出Recordset記錄集中的全部資料手工生成表格,或用同樣的檢索條件對資料庫進行二次檢索,但這無疑要增加伺服器的負擔。其次,在同一張圖表中繪制的曲線隻能是同一種類型,或同為平滑曲線圖,或同為柱狀圖,它不能在同一張圖表中顯示不同類型的曲線。最後,在某些細節方面,如分類(X)軸的設定方面,OWC無法提供更加詳細、人性化的設定途徑。如果讀者要追求更強大的功能和更好的顯示效果,筆者向您推薦兩個專業的基于.NET的圖表控件,這兩個控件分别由Dundas和Softwarefx公司出品,都同時支援Web Form和Win Form開發,隻是這兩個控件都是付費的。讀者如果有興趣,可以到它們的網站去下載下傳DEMO版本,以親身體驗一下專業圖表控件帶來的強大功能。