Исключение необработанного переполнения MSChart после масштабирования

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

(и т. д. - см. ссылку выше для полной трассировки.)

Я удалил все обработчики событий для диаграммы, и мне не удалось остановить масштабирование из eventuall, вызывающего это исключение. Я установил для IsUserSelectionEnabled значение false для диаграммы и безуспешно выполнял масштабирование из кода.

Любая помощь по этому вопросу была бы замечательной. Ваше здоровье.

Это исключение возникает каждый раз, когда вы «слишком далеко» уменьшаете масштаб (значение которого может различаться), независимо от того, как настроена остальная часть диаграммы. Несколько человек сообщили об этой проблеме. Помощник по исключению указывает, что он находится в System.Drawing.dll.

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


person MickeyfAgain_BeforeExitOfSO    schedule 29.09.2010    source источник
comment
Почему. Почему. Почему. Почему я выбрал MS Chart Control для кодирования своего приложения: - (((((((((((((((   -  person Mehdi LAMRANI    schedule 23.05.2011
comment
Есть ли соответствующий метод (что-то вроде dataArea.OnZoom ()) для MS Chart Control? Если это так, вы могли бы добавить обработчик для этого сообщения и, возможно, обработать ошибку. Просто мысль.   -  person David T. Macknet    schedule 15.06.2011
comment
Можете ли вы сказать, на каком уровне масштабирования возникает исключение? Существуют ли процентные переменные масштабирования, которые можно зафиксировать в исключении? Таким образом, вы можете, по крайней мере, предотвратить это, установив порог. Я играл с этой библиотекой около 3 лет назад, но никогда не сталкивался с масштабированием. Извините, я невежественен ... вы можете изучить использование Ext JS. (Sencha.com)   -  person MacGyver    schedule 20.07.2011


Ответы (5)


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

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
person zeFrenchy    schedule 06.10.2011
comment
Ясно chartarea.AxisX.ScaleView.MinSize = 0.0001; это самый чистый путь. Это может зависеть от некоторых других свойств, потому что на моих диаграммах мне нужно было поставить 0,1 эпсилон, чтобы избежать OverflowEx во всех случаях (и мне все равно не нужна дополнительная точность). - person Patrick from NDepend team; 08.10.2013

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

серия без увеличениясерия полностью увеличена

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

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

person zeFrenchy    schedule 21.07.2011

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

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

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

HTH

person Chris Zeh    schedule 26.10.2012

Я думаю, что исключение переполнения возникает, когда MSChart вычисляет уровень «Фактическое масштабирование». Я столкнулся с той же проблемой с настраиваемым масштабированием. Я исправил эту проблему, заключив масштабирование в блок 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^){}
person Zoltan Tirinda    schedule 08.03.2013

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

person Pawel Troka    schedule 16.10.2016