2016-08-27 58 views
1

我正在嘗試使用帶有類型列的圖表中顯示的數據進行簡單的WindowsFormAplication。現在在c中的圖表上選擇多個部分#

,這個想法是用戶選擇圖表的一部分,併爲節目找到相同的數據集相同的編號,並選擇在同一圖表上所有的人。我的程序就是這樣做的,直到它需要在該圖表上顯示多個選項。我只發現了一種選擇數據的方式,那就是通過 Cursor.SetSelectionPosition(double,double); 但似乎沒有多選的選項。

這甚至可以在標準圖表上? 有關如何在C#中完成此任務的任何建議將不勝感激。

回答

2

在任何時候只能選擇一個範圍。

所以,你需要..

  • ..collect範圍和
  • ..probably還收集所選DataPoints
  • 最後你還需要決定一個UI來清除選擇。

一種簡單的方式來顯示多個選擇,非常相似的光標選擇添加Striplines ..:

enter image description here

下面是上述結果的代碼;請注意,它假定您的值將適合float並濫用SizeF結構來存儲選擇的開始和結束值。如果你想更精確,你可以用Tuple<double, double>代替它..:

前三類級別變量來保存數據,正在進行的選擇,範圍列表和DataPoint索引列表:

SizeF curRange = SizeF.Empty; 
List<SizeF> ranges = new List<SizeF>(); 
List<int> selectedIndices = new List<int>(); 

此事件保持在參數e新的選擇,所以我們可以存儲他們:

private void chart1_SelectionRangeChanging(object sender, CursorEventArgs e) 
{ 
    curRange = new SizeF((float)e.NewSelectionStart, (float)e.NewSelectionEnd); 
} 

現在的選擇過程完成;現在選擇數據丟失了,但是我們已經存儲了它們。因此,我們可以添加新的範圍,收集新選擇DataPoint指數終於創建並顯示一個新的StripLine

private void chart1_SelectionRangeChanged(object sender, CursorEventArgs e) 
{ 
    ranges.Add(curRange); 
    selectedIndices.Union(collectDataPoints(chart1.Series[0], 
          curRange.Width, curRange.Height)) 
        .Distinct(); 

    StripLine sl = new StripLine(); 
    sl.BackColor = Color.FromArgb(255, Color.LightSeaGreen); 
    sl.IntervalOffset = Math.Min(curRange.Width, curRange.Height); 
    sl.StripWidth = Math.Abs(curRange.Height - curRange.Width); 
    chart1.ChartAreas[0].AxisX.StripLines.Add(sl); 
} 

這個小程序應該收集所有DataPoint指數範圍:

List<int> collectDataPoints(Series s, double min, double max) 
{ 
    List<int> hits = new List<int>(); 
    for (int i = 0; i < s.Points.Count ; i++) 
     if (s.Points[i].XValue >= min && s.Points[i].XValue <= max) hits.Add(i); 
    return hits; 
} 

要請清除選擇,清除兩個列表,即StripLines集合和curRange結構。