在c#中选择图表上的多个部分

我试图创建一个简单的WindowsFormAplication,其数据显示在带有类型列的图表中。

现在,我们的想法是让用户选择图表的一部分,并让程序从同一数据集中找到相同的数字,并在相同的图表上选择所有这些数字。 我的程序正是这样做的,直到它需要在该图表上显示多个选择。

我只找到了一种选择数据的方法,那就是通过Cursor.SetSelectionPosition(double,double); 但似乎没有多项选择的选择。

这在标准图表上是否可行? 有关如何在C#中实现此目的的任何建议将非常感激。

任何时候都只能选择一个范围。

所以你需要……

  • ..收集范围和
  • ..可能还会收集选定的DataPoints
  • 最后,您还需要决定UI以清除选择。

显示多个选项的简单方法,与光标选择非常相似的是添加Striplines ..:

在此处输入图像描述

以下是上述结果的代码; 请注意,它假定您的值适合float并滥用SizeF结构来存储选择的开始值和结束值。 如果你想更精确,你可以用Tuple来替换它:

前三个类级别变量用于保存数据,正在进行的选择,范围列表和DataPoint索引列表:

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

此事件包含参数中的新选择,因此我们可以存储它们:

 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 collectDataPoints(Series s, double min, double max) { List hits = new List(); 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结构。