[MSChart] 使用客制化Filter並在Y軸放入多個ValueMember

Y軸除了放統計值外,還能再加入一個識別ID嗎,比如產品代號或是人員代號等,這是我一開始在摸MSChart時的疑問,而這個答案現在是肯定的,它是可以的,而這次除了會在Y軸放入一個識別ID外,還會用這個ID來做Filter.

Y軸除了放統計值外,還能再加入一個識別ID嗎,比如產品代號或是人員代號等,這是我一開始在摸MSChart時的疑問,而這個答案現在是肯定的,它是可以的,而這次除了會在Y軸放入一個識別ID外,還會用這個ID來做Filter,而這個Filter也是MSChart本身就有的功能,接下來說開始拿這兩個部份開始.

 

首先,先來瞭解怎麼在YValueMember放入多個欄位,其實這個動作很簡單,我們只要在Series裡的YValueMembers輸入每個會用到的欄位來源名稱即可,而欄位間以逗號做分隔.

以這個例子來說,我的YValue除了要以DepQty來顯示統計圖表外,我還希望每個資料點還能存有DepID,這樣我在點下資料點時,同時還能知道它的ID是多少.

所以我在YValueMembers輸入 : DepQty,DepID

因為我們有兩個YValue,所以我們在YValuesPerPoint要改為2,這樣就完成設定動作了.

*第一個會是用來顯示統計圖的值,所以別把其它識別代號移到第一個.

image

這樣統計圖就能依DepQty顯示,而每個DataPoint還有DepID

image

那接下來,我們要怎麼應用這個DepID來做Filter,MSChart Control有幾個可以用,但這次我們將用一個自行定義的來做,這時會用到IDataPointFilter.

private class CustomFilter : IDataPointFilter
{
	double val;
	public CustomFilter(double CompareValue)
	{
		val = CompareValue;
	}
	public bool FilterDataPoint(DataPoint datapoint, Series series, int pointIndex)
	{
		return datapoint.YValues[1] == val;
	}
}

第10行可以看到一點,我的datapoint.YValues是抓index=1的值,而不是0,因為0是DepQty,而1才是存放DepID,所以很容易的就知道,它是以陣列的方式在存.

 

完成了IDataPointFilter,接下來我們就要拿它來用,只要一行code就可以用了.

chart1.DataManipulator.Filter(new CustomFilter(Double.Parse(comboBox1.SelectedItem.ToString())), chart1.Series[0]);

 

 

 

 

第一個傳入值是我們要過濾的條件,而第二個則是我們要過濾的Series.

 

而這之前,我們要先瞭解兩個屬性,不然過濾出來的結過可能會跟你想像的不一樣.

DataManipulator.FilterMatchedPoints :

這個屬性的預設值是true,所以它在Filter後,統計圖上所會顯示的會是"不符合"我們條件的資料,這點跟我們在玩的DataView.RowFilter相反,所以要顯示的是符合條件的資料時,這個要記得設為false.

DataManipulator.FilterSetEmptyPoints :

預設值是false,所以不符合條件的,就會從圖表移除.

image

如果設為true,則會顯示全部.

image

 

 

其它還有一些Filter可以用,例如FilterTopN等,有機會再挖出來玩.

 

原始碼 :MSChartDemo.rar