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

时间:2016-08-27 13:54:49

标签: c# charts

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

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

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

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

1 个答案:

答案 0 :(得分:2)

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

所以你需要..

  • ..收集范围和
  • ..可能还会收集所选的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结构。