原創|其它|編輯:郝浩|2012-01-30 20:38:44.000|閱讀 491 次
概述:本文在上一篇的基礎之上,本文主要介紹如何在圖表中加入篩選功能,以及根據數據動態更改圖表類型。
# 界面/圖表報表/文檔/IDE等千款熱門軟控件火熱銷售中 >>
本文在上一篇《在Silverlight下用Visifire如何展現多維數據集中的數據》的基礎之上,本文主要介紹如何在圖表中加入篩選功能,以及根據數據動態更改圖表類型。
為圖表增加篩選:
實現思路:在上一篇所示例的MDX語句的基礎之上,請查看如下MDX語句:
select [Measures].[Reseller Order Count] on 0,
[Product].[Category].members on 1
from [Sales Targets]
where [Sales Territory].[Sales Territory Country].&[United States]
此處多了where部分,所以我們實現的思路就是通過where查詢來對結果進行篩選。
順便提一下,多個值的篩選如下:
select [Measures].[Reseller Order Count] on 0,
[Product].[Category].members on 1
from [Sales Targets]
where {[Sales Territory].[Sales Territory Country].&[United States],[Sales Territory].[Sales Territory Country].&[United Kingdom]}
這里我們只做簡單的示例,所以篩選假設只有一個條件。
首先需要獲取一個維度下的所有成員。雖然維度信息可以在AdomdConnection對象下獲得,但是由于層次和等級下都有成員不大好確定,所以這里我用一個比較笨的方法,通過MDX語句來查。如下:
select [Measures].[Reseller Order Count] on 0,
[Sales Territory].[Sales Territory Country].[Sales Territory Country].members on 1
from [Sales Targets]
查詢的結果:
如上圖,列的起始位置和行的起始位置已經標出。根據這個結果,只需要在AdomdDatareader結果中通過循環把第0列的信息讀取出來就可以了。(我承認,這個方法很笨)
打開上一節中建立的項目,找到web項目下的web服務文件,添加如下服務代碼:
[WebMethod]
public List<string> GetCountryMember()
{
List<string> result = new List<string>();
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;
string strMDX = "select [Measures].[Reseller Order Count] on 0,
[Sales Territory].[Sales Territory Country].
[Sales Territory Country].members on 1 from
[Sales Targets] ";
comm.CommandText = strMDX;
AdomdDataReader dr = comm.ExecuteReader();
while (dr.Read())
{
result.Add(dr[0].ToString());
}
return result;
}
通過這個服務可以(間接地)獲取Sales Territory Country等級下的成員。
然后再在服務中添加一個方法,這個服務和上一節提到的服務差不多,只不過其中有一個string類型的參數,通過它來構建 MDX查詢中where后面的部分。代碼如下:
[WebMethod]
public List<ChartItem> GetResultByCountry(string countryname)
{
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;
string strMDX =
"select [Measures].[Reseller Order Count] on 0,[Product].[Category].
[Category].members on 1 from [Sales Targets] ";
strMDX += "where [Sales Territory].
[Sales Territory Country].&["+countryname+"]";
comm.CommandText = strMDX;
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;
}
至此,服務部分的代碼構建完畢。
接下來,需要更新silverlight的服務引用:
如上圖,在silverlight項目里展開Service References服務引用,找到上一節已經添加好的服務,右鍵單擊它,選擇Update Service Reference更新服務引用就可以了。Visual studio會根據web服務里的wsdl重新生成本地代理類。
服務更新完畢后,打開上一節創建的visifire圖表界面,為界面添加一個ListBox作為國家列表的篩選。
這里的XAML文件如下:
<UserControl x:Class="SLVisifire.Page"
xmlns="//schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="//schemas.microsoft.com/winfx/2006/xaml"
Width="500" Height="300"
xmlns:Visifire_Charts="clr-namespace:Visifire.
Charts;assembly=SLVisifire.Charts">
<Grid x:Name="LayoutRoot" Background="White">
<Visifire_Charts:Chart Margin="31,38,170,77" Name="chtTest"/>
<ListBox HorizontalAlignment="Right"
Margin="0,38,33,103" Width="113" Name="lstCountry" />
</Grid>
</UserControl>
注:ListBox的添加是可以通過Blend來進行的,aspnetx承認在visual studio里硬敲是很痛苦的。這里直接給出結果xaml代碼,具體在Blend如何添加ListBox可以參考TerryLee的相關silverlight教程。
最后打開與之對應的xaml.cs文件,此處需要對之前的代碼進行比較大的改動,全部代碼如下:
Code
namespace SLVisifire
{
public partial class Page : UserControl
{
WebService1SoapClient wc = new WebService1SoapClient();
List<ChartItem> lstItem = new List<ChartItem>();
public Page()
{
InitializeComponent();
this.Loaded += new RoutedEventHandler(Page_Loaded);
}
void Page_Loaded(object sender, RoutedEventArgs e)
{
wc.GetCountryMemberCompleted +=
new EventHandler<GetCountryMemberCompletedEventArgs>
(wc_GetCountryMemberCompleted);
wc.GetResultByCountryCompleted += new EventHandler<GetResultByCountryCompletedEventArgs>
(wc_GetResultByCountryCompleted);
wc.GetCountryMemberAsync();
//當ListBox的選項被更改后才調用加載圖表數據的服務
lstCountry.SelectionChanged += new SelectionChangedEventHandler(lstCountry_SelectionChanged);
//先放置一個空的數據序列在里面,供后面索引到
DataSeries ds = new DataSeries();
chtTest.Series.Add(ds);
}
void lstCountry_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
wc.GetResultByCountryAsync(((ListBoxItem)lstCountry.SelectedItem).
Content.ToString());
}
void wc_GetResultByCountryCompleted
(object sender, GetResultByCountryCompletedEventArgs e)
{
lstItem.Clear();
foreach (ChartItem item in e.Result)
{
lstItem.Add(item);
}
LoadChart();
}
void wc_GetCountryMemberCompleted
(object sender, GetCountryMemberCompletedEventArgs e)
{
foreach (string item in e.Result)
{
ListBoxItem li = new ListBoxItem();
li.Content = item;
lstCountry.Items.Add(li);
}
//加載完國家列表之后自動選擇第一個元素,從而觸發加載圖表的事件
lstCountry.SelectedIndex = 0;
}
//加載圖表
void LoadChart()
{
//獲取之前添加的數據序列,重新賦予數據
DataSeries ds = chtTest.Series[0];
ds.DataPoints.Clear();
foreach (ChartItem item in lstItem)
{
DataPoint dp = new DataPoint();
dp.AxisXLabel = item.Title;
dp.YValue = item.Value;
ds.DataPoints.Add(dp);
}
}
}
}
這里需要兩次調用服務,第一次加載國家列表,然后每次列表選項更改之后就自動加載另外一個服務把選擇的國家傳遞進去重新獲得圖表數據。
自此,為圖表增加篩選功能的部分修改完畢,運行程序,界面如下:
以上演示的代碼是通過一個維度作為篩選依據的示例,當然也可以其它或者更多的維度篩選,方法基本為重復如上的步驟,在此不做太多描述,如有有問題可以和aspnetx聯系。
為圖表增加動態選取:
也許到目前為止對如上實現功能還不夠滿足,那么就再加入一些比較眩目的功能。針對上一個圖的效果,只能顯示柱圖,很枯燥,那么添加一個可以隨便切換圖表類型怎么樣?
借助Visifire的功能這個我們可以輕易實現,不過aspnetx在這里建議,對于離散行的變量,適合用柱圖,餅圖,橫條圖等方式來展示,對于連續型變量,適合用線圖來展示。所以這里我們選擇圖表可以在柱圖,餅圖和橫條圖之間來切換。
首先在界面再添加一個ListBox。
<ListBox Height="72" HorizontalAlignment="Right"
Margin="0,0,33,21" VerticalAlignment="Bottom"
Width="113" Name="lstChartType" SelectedIndex="0" >
<ListBoxItem Content="柱圖"/>
<ListBoxItem Content="餅圖"/>
<ListBoxItem Content="橫條圖"/>
</ListBox>
同樣,這個操作建議在Blend操作生成。
然后,在頁面(更確切的應該說是用戶控件)構造函數,注冊如下事件:
lstChartType.SelectionChanged += new SelectionChangedEventHandler(lstChartType_SelectionChanged);
然后加入如下響應代碼:
void lstChartType_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
switch (((ListBoxItem)lstChartType.SelectedItem).Content.ToString())
{
case "柱圖":
chtTest.Series[0].RenderAs = RenderAs.Column;
break;
case "餅圖":
chtTest.Series[0].RenderAs = RenderAs.Pie;
break;
case "橫條圖":
chtTest.Series[0].RenderAs = RenderAs.Bar;
break;
}
}
至此,功能添加完畢,運行程序,就可以通過新加的ListBox來更改圖表類型。先看看下面兩個圖吧:
看上去,是不是沒有先前功能那么枯燥了?
總結:
本文在前一篇文章的基礎上進行功能擴充,實現更眩更豐富的數據展現效果。通過這兩篇文章相信您一定對silverlight以及多維數據集MDX有個更深刻的印象,并且理解使用Silverlight來展現BI數據的優勢。
本站文章除注明轉載外,均為本站原創或翻譯。歡迎任何形式的轉載,但請務必注明出處、不得修改原文相關鏈接,如果存在內容上的異議請郵件反饋至chenjj@fc6vip.cn
文章轉載自:網絡轉載