我正在尝试创建一个简单的WindowsFormAplication,其数据显示在带有类型列的图表中。
现在,我们的想法是让用户选择图表的一部分,并让程序从同一数据集中找到相同的数字,并在相同的图表上选择所有这些数字。我的程序正是这样做的,直到它需要在该图表上显示多个选择。
我只找到了一种选择数据的方法,那就是通过 Cursor.SetSelectionPosition(double,double); 但似乎并不是多重选择的选择。
这在标准图表上是否可行? 有关如何在C#中完成此任务的任何建议将非常感激。
答案 0 :(得分:2)
任何时候都只能选择一个范围。
所以你需要..
DataPoints
。显示多个选项的简单方法,与光标选择非常相似,即添加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
结构。