9

这个问题在 MSChart 论坛上已经一年多没有回答了。

我不断在图表上遇到溢出异常。我正在按如下方式设置图表:

InstrChart.Legends.Clear();
dataArea = InstrChart.ChartAreas.Add("Instr1");
dataArea.AxisX.MajorGrid.Enabled = false;
dataArea.AxisY.MajorGrid.Enabled = false;
dataArea.CursorX.IsUserSelectionEnabled = true;

然后我添加了 12 个系列,每个系列大约 10000 点。

当我缩小到每个系列仅显示 3 或 4 个点时会发生异常。在我释放鼠标按钮进行缩放后,立即出现以下异常:

System.OverflowException was caught   
  Message="Overflow error."   
  Source="System.Drawing"   
  StackTrace:   
     at System.Drawing.Graphics.CheckErrorStatus(Int32 status)   

(等 - 有关完整跟踪,请参见上面的链接。)

我已经删除了图表的所有事件处理程序,但没有成功停止从最终导致此异常的缩放。我已将图表的 IsUserSelectionEnabled 设置为 false,并在没有运气的情况下完成了代码的缩放。

在这个问题上的任何帮助都会很棒。干杯。

无论图表的其余部分如何配置,只要您缩小“太远”(其含义可能会有所不同),就会出现此异常。有几个人报告了这个问题。异常帮助器表明它在 System.Drawing.dll 中。

这里有人有任何线索或解决方法吗?

4

5 回答 5

1

今天我在错误地使用相同的开始值和结束值设置缩放时遇到了同样的问题。

chartarea.AxisX.ScaleView.Zoom(chartarea.CursorX.SelectionStart, chartarea.CursorX.SelectionStart); // second argument should have been chartarea.CursorX.SelectionEnd

然后我尝试了以下作为实验:

chartarea.AxisX.ScaleView.Zoom(chart.CursorX.SelectionStart, chartarea.CursorX.SelectionStart + 0.00000001); // crash
chartarea.AxisX.ScaleView.Zoom(chart.CursorX.SelectionStart, chartarea.CursorX.SelectionStart + 0.0000001);  // no crash

您的数据点是否可能如此接近以至于您的起点和终点之间的距离低于上面观察到的阈值?我建议您尝试将时间值乘以 100 或 1000,看看问题是否消失。

消除此问题的另一种方法是在 ScaleView 上设置 MinSize。

chartarea.AxisX.ScaleView.MinSize = 0.0001; // something bigger than 0.0000001 works for me
于 2011-10-06T14:34:34.000 回答
0

我认为当 MSChart 计算“实际缩放”级别时会发生溢出异常。我在自定义缩放时遇到了同样的问题。我通过将缩放包装到 try-catch 块中来解决此问题。但是我没有尝试过,Dominique Jacquel 的解决方案似乎更可靠。

    try
    {
        Double GraphSize = Math::Abs(Graph->AxisX->Minimum-Graph->AxisX->Maximum) +                                             
                           Math::Abs(Graph->AxisY->Minimum-Graph->AxisY->Maximum);

        Double ScaleViewSize = Math::Abs(NewMinX-NewMaxX) + Math::Abs(NewMinY-NewMaxY);

        // if the difference of the two sizes are enormous, then Overflow exception occurs
        ActualZoom = Convert::ToInt32((GraphSize/ScaleViewSize)*100.0);

        // zoom
        Graph->AxisX->ScaleView->Zoom(NewMinX, NewMaxX);
        Graph->AxisY->ScaleView->Zoom(NewMinY, NewMaxY);
    }
    catch(OverflowException^){}
于 2013-03-08T11:15:19.483 回答
0

我设置了一个快速测试应用程序并且无法重现。

系列未缩放 系列完全放大

这是我的系列初始化代码

chart1.Legends.Clear();
Random r = new Random();
for(int i = 0; i < 12; i++)
{
  Series series = new Series();
  series.ChartType = SeriesChartType.FastLine;
  for (int j = 0; j < 10000; j++)
  {
    series.Points.Add(r.NextDouble() + i + 3*Math.Sin((double)j/300.0f));
  }
  chart1.Series.Add(series);
  }

这是图表初始化代码

chartArea1.AxisX.MajorGrid.Enabled = false;
chartArea1.AxisY.MajorGrid.Enabled = false;
chartArea1.CursorX.IsUserSelectionEnabled = true;
chartArea1.Name = "ChartArea1";
this.chart1.ChartAreas.Add(chartArea1);
this.chart1.Dock = System.Windows.Forms.DockStyle.Fill;
legend1.Name = "Legend1";
this.chart1.Legends.Add(legend1);
this.chart1.Location = new System.Drawing.Point(0, 0);
this.chart1.Name = "chart1";
this.chart1.Size = new System.Drawing.Size(616, 273);
this.chart1.TabIndex = 0;
this.chart1.Text = "chart1";

异常数据是否依赖?您是否也为 X 提供值?您的系列是否使用非常小或非常大的值?例如,您是否尝试过将您的系列设置为简单的正弦波?

另外,您使用的是什么版本的控件和 VS?你的目标是什么框架?

于 2011-07-21T09:45:57.977 回答
0

类似于 David T. Macknet 在上面的评论中所说的:

您可以添加一个处理程序来更好地管理缩放:

AddHandler aChart.AxisViewChanged, AddressOf Chart_ViewChanged

您的函数将如下所示:

Public Sub Chart_ViewChanged(ByVal sender As Object, ByVal e As System.Windows.Forms.DataVisualization.Charting.ViewEventArgs)
        'The Zoom event changes the view state twice, first for the XAxis then the YAxis.'
End Sub

高温高压

于 2012-10-26T17:58:48.973 回答
0

我很确定这是因为 GDI+ 限制被称为“ GDI+ 绘图坐标的硬边界”。不幸的是,我们不能用它做很多事情,因为它是 MSChart 控件实现中的一个问题,其中会发生一些缩放,导致绘图值超出 GDI+ 绘图 API 的硬边界。解决方法是不使用缩放选项或 FastLine 绘图。

于 2016-10-16T12:04:55.083 回答