有没有办法将图表控件复制到新表单? 我有一个带有图表控件的Windows窗体,但不允许该窗体可调整大小。出于这个原因,我有一个按钮" Zoom"以可调整大小的新形式打开图表。我在"原创"中设置了很多图表属性。图表(轴颜色,轴间隔等),并希望重用此属性。我试图用图表作为参数调用新表单的构造函数,但是没有用。
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();
答案 0 :(得分:1)
像深度复制对象一样复制?
我最近遇到了这个问题。遗憾的是,MS Chart没有方法来克隆他们的图表对象,并且他们的类没有标记为可序列化,因此您无法使用建议的方法here。
如果你想以正确的方式做到这一点,你必须引入第三方控件,例如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;
}
这不是一个有效的解决方案,但如果性能不是您的首选,那就像魅力一样。