9

この質問は、MSChart フォーラムで 1 年以上答えられずに苦しんでいます。

グラフでオーバーフロー例外が継続的に発生します。次のようにチャートを設定しています。

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

次に、それぞれ約 10000 ポイントの 12 シリーズを追加します。

シリーズごとに 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

クイック テスト アプリをセットアップしましたが、再現できません。

ズーム解除されたシリーズ シリーズ完全ズーム

これが私のシリーズの初期化コードです

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

HTH

于 2012-10-26T17:58:48.973 に答える
0

MSChart が ' Actual Zoom ' レベルを計算するときに、オーバーフロー例外が発生すると思います。カスタムズームで同じ問題に直面していました。ズームを 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 に答える