0

チャート コントロールを新しいフォームにコピーする方法はありますか? チャート コントロールを含む Windows フォームがありますが、フォームのサイズを変更することはできません。そのため、サイズ変更可能な新しいフォームでチャートを開く「ズーム」ボタンがあります。「元の」チャートに多くのチャート プロパティ (軸の色、軸の間隔など) を設定しましたが、このプロパティを再利用したいと考えています。チャートをパラメーターとして新しいフォームのコンストラクターを呼び出そうとしましたが、うまくいきませんでした。

public ZoomChartSeriesForm(Chart myChart)

私の主な問題は、チャート内のズームを許可し、チャートをコピーするだけでクラッシュすることです。

これが私の「元のチャート」のコードです(例):

        System.Drawing.Color color = System.Drawing.Color.Red;
        //plot new doublelist
        var series = new Series
        {
            Name = "Series2",
            Color = color,
            ChartType = SeriesChartType.Line,
            ChartArea = "ChartArea1",
            IsXValueIndexed = true,
        };

        this.chart1.Series.Add(series);

        List<double> doubleList = new List<double>();
        doubleList.Add(1.0);
        doubleList.Add(5.0);
        doubleList.Add(3.0);
        doubleList.Add(1.0);
        doubleList.Add(4.0);

        series.Points.DataBindY(doubleList);

        var chartArea = chart1.ChartAreas["ChartArea1"];
        LabelStyle ls = new LabelStyle();
        ls.ForeColor = color;
        Axis a = chartArea.AxisY;
        a.TitleForeColor = color; //color of axis title
        a.MajorTickMark.LineColor = color; //color of ticks                  
        a.LabelStyle = ls; //color of tick labels

        chartArea.Visible = true;
        chartArea.AxisY.Title = "TEST";
        chartArea.RecalculateAxesScale();
        chartArea.AxisX.Minimum = 1;
        chartArea.AxisX.Maximum = doubleList.Count;

        // Set automatic scrolling 
        chartArea.CursorX.AutoScroll = true;
        chartArea.CursorY.AutoScroll = true;
        // Allow user to select area for zooming
        chartArea.CursorX.IsUserEnabled = true;
        chartArea.CursorX.IsUserSelectionEnabled = true;
        chartArea.CursorY.IsUserEnabled = true;
        chartArea.CursorY.IsUserSelectionEnabled = true;
        // Set automatic zooming
        chartArea.AxisX.ScaleView.Zoomable = true;
        chartArea.AxisY.ScaleView.Zoomable = true;
        chartArea.AxisX.ScrollBar.IsPositionedInside = true;
        chartArea.AxisY.ScrollBar.IsPositionedInside = true;
        //reset zoom
        chartArea.AxisX.ScaleView.ZoomReset();
        chartArea.AxisY.ScaleView.ZoomReset();

        chart1.Invalidate();
4

1 に答える 1

1

オブジェクトのディープ コピーのようにコピーしますか?

私は最近、この正確な問題に遭遇しました。残念ながら、MS Chart にはチャート オブジェクトを複製する方法がなく、そのクラスはシリアル化可能としてマークされていないため、ここで提案されている方法を使用することはできません。

これを正しく行うには、Copyableなどのサード パーティ製のコントロールを導入するか、リフレクションを自分で処理する必要がありますが、これは簡単なことではありません。

私が見つけた非常に優れた回避策は、MS Chart コントロール内で組み込みのシリアル化を使用することです。アイデアは、memorystream を使用してグラフをシリアル化し、グラフの新しいインスタンスを作成して、グラフを逆シリアル化することです。

private Chart CloneChart(Chart chart)
{
    MemoryStream stream = new MemoryStream();
    Chart clonedChart = chart;
    clonedChart.Serializer.Save(stream);
    clonedChart = new Chart();
    clonedChart.Serializer.Load(stream);
    return clonedChart;
}

正確には効率的なソリューションではありませんが、パフォーマンスが優先事項でない場合、これは魅力的に機能します。

于 2013-07-29T07:31:00.510 に答える