原創|其它|編輯:郝浩|2012-10-18 13:45:05.000|閱讀 306 次
概述:文主要描述在Siverlight下使用圖表組件Visifire展現多維數據集中的數據。由于多維數據集結構本身很復雜所以本文使用一維的查詢結果,側重于從OLAP到Silverlight端的方法。
# 界面/圖表報表/文檔/IDE等千款熱門軟控件火熱銷售中 >>
為什么要用visifire?
其實在微軟的silverlight toolkit中已經有了圖表組件,但是筆者認為其效果不如visifire的效果好,而且visifire中的每個數據點datapoint都可以被點擊到,這個在做BI相關項目的時候很重要,因為類似drill down/up和drill throught to detail的操作都得依賴這個來實現。
建立Silverlight項目:
打開Visual Studio 2008,選擇文件,新建Silverlight項目。新建項目的同時會提示是使用asp.net web項目來寄宿silverlight項目還是只使用一個簡單的測試頁來寄宿silverlight項目。這里選擇asp.net web application項目。
Silverlight本身作為瀏覽器的插件是沒有System.Data 這樣的命名空間的,所以需要從數據庫或其它數據源獲取數據的話就需要通過webservice以及類似的方式,所以,為silverlight提供數據的webservice相關資源我們會建立在剛才的寄宿silverlight的asp.net web applition項目中。
添加Visifire到頁面中:
首先需要添加visifire引用到項目中。這里我們只需添加一個dll文件即可
其中WPFVisifire.Chart.dll是在WPF Application下使用的,SLVisifire.Charts.dll是在silverlight項目下使用的。
這里我們在剛才建立的silverlight項目下右鍵單擊References,選擇Add References…,在彈出的Add Reference窗體下選擇Browse選項卡,定位到visifire下載目錄,找到SLVisifire.Charts.dll,然后單擊OK。
由于visual studio本身是不支持silverlight控件的設計時拖拽支持的,所以這里需要用到Blend2。右鍵單擊Page.xaml文件,選擇Open in Expression Blend…。只要正確安裝了Blend2+SP1,那么這個選項就會出現。
在Blend中,找到我們添加的visifire chart控件放到Page.xaml中,具體方法如下:
如上圖,在Blend的工具欄中找到>>這樣的按鈕,單擊它,會出現Asset Library對話框,選擇Custom Controls,然后單擊Chart。這個Chart就是我們要添加的Visifire chart。現在鼠標變成了一個十字型,在面板上勾畫一個矩形區域,至此visifire chart添加完畢。
Visifire 2以后的版本都帶了Blend設計時支持,所以在Blend里可以看到其占位符。此外,我們還需要給這個chart取一個名字(默認是沒有名字的),好以后在c#文件里可以引用到它:
我們也可以在代碼中創建chart到面板中,visifire的document中有很多示例代碼,在此不作過多描述。
建立WebService服務:
回到visual studio中。由于數據來自于多維數據集,所以需要添加ADOMD.Net的引用。右鍵asp.net web application項目,選擇Add Reference…,找到Microsoft.AnalysisServices.AdomdClient,選擇10版本的,如下圖:
接下來添加服務文件,同樣右鍵asp.net web application項目,選擇Add-New Item…,在彈出的對話框中選擇Web Service,添加一個web服務到項目中。
打開這個服務文件,在頂部添加如下引用:
using Microsoft.AnalysisServices.AdomdClient;
Visual Studio會為我們默認添加一個Hello World方法,刪除它,然后加入如下代碼:
[WebMethod]
public List<ChartItem> GetResult() { List<ChartItem> result = new List<ChartItem>(); AdomdConnection conn = new AdomdConnection(); conn.ConnectionString = "provider=msolap ;Integrated Security =SSPI ;Data Source= localhost ;Catalog = Adventure Works DW 2008 ;"; conn.Open(); AdomdCommand comm = new AdomdCommand(); comm.Connection = conn; comm.CommandText = "select [Measures].[Reseller Order Count] on 0,[Product].[Category].[Category].members on 1 from [Sales Targets]"; AdomdDataReader dr = comm.ExecuteReader(); while (dr.Read()) { ChartItem ci = new ChartItem(); ci.Title = dr[0].ToString(); ci.Value = double.Parse(dr[1].ToString()); result.Add(ci); } return result; }
返回類型是List<ChartItem>,其中ChartItem是自定義的一個類,代碼如下:
public class ChartItem { public string Title { get; set; } public double Value { get; set; } }
數據的查詢過程和查詢數據庫的大同小異,只不過是針對多維數據集有專門的AdomdConnection和AdomdCommand等對象。接受結果用CellSet是比較多的,但是這里由于只用了一維的數列,結構相對比較簡單,所以用AdomdDataReader來接收就足夠了。然后dr.Read()循環創建ChartItem對象添加到類型為List<ChartItem>的結果result中。
本站文章除注明轉載外,均為本站原創或翻譯。歡迎任何形式的轉載,但請務必注明出處、不得修改原文相關鏈接,如果存在內容上的異議請郵件反饋至chenjj@fc6vip.cn
文章轉載自:博客園