[C#] Chart中多ChartAreas的Series與Legent設定

 Chart控制項是Visual Studio製作圖表頗強的工具。我想很多的網站都多少提到一些基本的,就不多重複了! 作為自己的筆記,就寫一些,實作時東找西找才找到完整東西來進行自己要的功能!如下圖,一個Chart,有三個ChartArea。在Series(數列)與Legent(圖標)對應到不同的ChartArea的筆記。





先講Series設定歸屬哪個ChartArea。由上而下,三個ChartArea分別命名為"waizi", "touxin", 以及"ziying"。我們有六個數列,分別命名為"外資買賣超", "外資持股", "投信買賣超", "投信持股", "自營商買賣超", "自營商持股"。數列歸屬程式段如下:



chartResult.Series["外資買賣超"].ChartArea = "waizi";
chartResult.Series["外資持股"].ChartArea = "waizi";
chartResult.Series["投信買賣超"].ChartArea = "touxin";
chartResult.Series["投信持股"].ChartArea = "touxin";
chartResult.Series["自營商買賣超"].ChartArea = "ziying";
chartResult.Series["自營商持股"].ChartArea = "ziying";

接下來是Legent的歸屬。我們命名三個Legent為"Legent1", "Legent2", "Legent3"。


var lg1 = chartResult.Legends.First();
lg1.Name = "Legend1";
var lg2 = chartResult.Legends.Add("Legend2");
touxin_s.Legend = lg2.Name; //投信買賣超的Series 變數為touxin_s
touxin_Totals.Legend = lg2.Name; //投信持股的Series 變數為touxin_Totals
var lg3 = chartResult.Legends.Add("Legend3");
ziying_s.Legend = lg3.Name; //自營商買賣超的Series 變數為 ziying_s
ziying_Totals.Legend = lg3.Name; //自營商持股的Series 變數為 ziying_Totals
//注意: 沒設定歸屬的Series一律會放在第一個Legent

這樣就可以成功的分開為三個Legent了!接下來,便是Legent放置的位子了!相信大家如果查詢網路,很多都會看到Alignment與Docking的解說。裡面的Docking是針對整個Chart的。無法針對分別的ChartArea來進行上下左右的Docking。因此,這邊我就用了手動設定位置的方式。這裡就必須使用到了ElementPosition,這元件的參數為(X, Y, Width, Height)。但是,需要注意的是這裡的四個參數為百分比的,非絕對值。這樣有個好處,在Size改變時,不需要再去變更數值。我這裡使用的程式段如下:


chartResult.ChartAreas["waizi"].Position.Auto = false;
chartResult.ChartAreas["waizi"].Position = new ElementPosition(0, 0, 100, 29);
chartResult.ChartAreas["touxin"].Position.Auto = false;
chartResult.ChartAreas["touxin"].Position = new ElementPosition(0, 33, 100, 30);
chartResult.ChartAreas["ziying"].Position.Auto = false;
chartResult.ChartAreas["ziying"].Position = new ElementPosition(0, 67, 100, 29);
ElementPosition ep1 = chartResult.ChartAreas["waizi"].Position;
chartResult.Legends["Legend1"].Position.Auto = false;
chartResult.Legends["Legend1"].Position = new ElementPosition(ep1.X+10, ep1.Y + ep1.Height, 80, 4);
ElementPosition ep2 = chartResult.ChartAreas["touxin"].Position;
chartResult.Legends["Legend2"].Position.Auto = false;
chartResult.Legends["Legend2"].Position = new ElementPosition(ep2.X+10, ep2.Y + ep2.Height, 80, 4);
ElementPosition ep3 = chartResult.ChartAreas["ziying"].Position;
chartResult.Legends["Legend3"].Position.Auto = false;
chartResult.Legends["Legend3"].Position = new ElementPosition(ep3.X+10, ep3.Y + ep3.Height, 80, 4);

這邊注意的是,若用手動的就要先把Position.Auto先設定為false。

另外,如果覺得一個Chart配多個ChartArea設定很麻煩的話,可能可以乾脆設定三個Chart,每個Chart只配一個ChartArea。這樣也是另一種選擇!

留言

這個網誌中的熱門文章

C# 不規則陣列不定長度設定方法

多維陣列的Resize

C#利用DateTime估計程式執行時間