在任何時候只能選擇一個範圍。
所以,你需要..
- ..collect範圍和
- ..probably還收集所選
DataPoints
。
- 最後你還需要決定一個UI來清除選擇。
一種簡單的方式來顯示多個選擇,非常相似的光標選擇添加Striplines
..:
下面是上述結果的代碼;請注意,它假定您的值將適合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
結構。
來源
2016-08-31 11:28:16
TaW