MSChart Необработанное исключение переполнения после увеличения - PullRequest
8 голосов
/ 30 сентября 2010

Этот вопрос томился без ответа на форуме 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.

У кого-нибудь есть какие-нибудь подсказки или обходные пути?

Ответы [ 5 ]

1 голос
/ 06 октября 2011

Я столкнулся с той же проблемой сегодня, когда по ошибке установил масштаб с одинаковыми начальными и конечными значениями.

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 и посмотреть, исчезнет ли проблема.

Другой способ устранить эту проблему - установить MinSize для ScaleView.

chartarea.AxisX.ScaleView.MinSize = 0.0001; // something bigger than 0.0000001 works for me
0 голосов
/ 16 октября 2016

Я почти уверен, что это из-за ограничения GDI +, известного как " GDI + жесткие границы координат рисования ". К сожалению, мы не можем ничего с этим поделать, потому что это проблема в реализации элемента управления MSChart, где происходит некоторое масштабирование, из-за которого значения чертежа выходят за жесткие границы для API рисования GDI +. Временное решение: не использовать параметр «Масштаб» или чертеж FastLine.

0 голосов
/ 08 марта 2013

Я думаю, что исключение переполнения возникает, когда MSChart вычисляет уровень ' Actual Zoom '. Я столкнулся с той же проблемой с пользовательским масштабированием. Я исправил эту проблему, поместив масштабирование в блок try-catch. Однако я не пробовал, решение Доминика Жакеля кажется более надежным.

    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^){}
0 голосов
/ 26 октября 2012

Подобно тому, что Дэвид Т. Макнет сказал выше в комментарии:

Вы можете добавить обработчик, чтобы немного лучше управлять масштабированием:

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

НТН

0 голосов
/ 21 июля 2011

Я установил приложение для быстрого тестирования и не могу воспроизвести.

series unzoomed series fully zoomed

Вот код инициализации моей серии

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 вы используете? И на какие рамки вы ориентируетесь?

...