MsChart选择一部分数据并更新图表

我创建了一个程序来读取文本文件并将该文件中的数据显示到DataGridView中; 然后我使用来自此DGV的数据根据​​结果更新“图表”,图表仅包含折线图。

我想要完成的是允许用户选择该数据的一部分,我拖动它的开头和结尾,就像你只想启用x轴一样放大,并根据该选择更新图形,计算此数据子集的平均值。

运用

chart1.ChartAreas["ChartArea1"].CursorX.IsUserEnabled = Enabled; chart1.ChartAreas["ChartArea1"].CursorX.IsUserSelectionEnabled = Enabled; 

这允许我选择区域并放大,但​​我不确定如何根据选择而不仅仅是缩放来实际更新数据。

要允许很好的缩放,您应该将此行添加到您显示的两行:

 chart1.ChartAreas["ChartArea1"].AxisX.ScaleView.Zoomable = true; 

这是一个计算可见点的第一个Y值的平均值的函数:

 private void chart1_AxisViewChanged(object sender, ViewEventArgs e) { // for a test the result is shown in the Form's title Text = "AVG:" + GetAverage(chart1, chart1.Series[0], e); } double GetAverage(Chart chart, Series series, ViewEventArgs e) { ChartArea CA = e.ChartArea; // short.. Series S = series; // references DataPoint pt0 = S.Points.Select(x => x) .Where(x => x.XValue >= CA.AxisX.ScaleView.ViewMinimum) .DefaultIfEmpty(S.Points.First()).First(); DataPoint pt1 = S.Points.Select(x => x) .Where(x => x.XValue <= CA.AxisX.ScaleView.ViewMaximum) .DefaultIfEmpty(S.Points.Last()).Last(); double sum = 0; for (int i = S.Points.IndexOf(pt0); i < S.Points.IndexOf(pt1); i++) sum += S.Points[i].YValues[0]; return sum / (S.Points.IndexOf(pt1) - S.Points.IndexOf(pt0) + 1); } 

请注意, ViewEventArgs参数提供了View的位置和大小的值,但这些只是数据点的XValues而不是它们的索引; 所以我们需要从左边搜索第一个点,从右边搜索最后一个点。

更新有时缩放遇到一个特殊问题:当数据比默认的CursorX.IntervalType更细粒度时,它只是不允许你缩放。 在这种情况下,您只需要适应数据的规模,例如: CA.CursorX.IntervalType = DateTimeIntervalType.Milliseconds;