MS Chart Controls 确实不错,需求是实现柱状图与线分别使用不同的Y轴。因为线的值是累加当月到10号的实笔法产油总量,弄了好久,终于实现此效果,但似乎不是很完美。也很麻烦。下面是实现代码:
ids = rule.getNSCData(txt_RQ.Text);
//年生产动态
Chart1.DataSource = ids.Tables["NCL"];
Chart1.Series["Series1"].XValueMember = "RQ";
Chart1.Series["Series1"].YValueMembers = "yjh";
Chart1.Series["Series2"].XValueMember = "RQ";
Chart1.Series["Series2"].YValueMembers = "YL";
Chart1.Series["Series3"].YValueMembers = "otherYL";
Chart1.DataBind();
//调整区域位置
Chart1.ChartAreas["ChartArea1"].Position = new ElementPosition(20, 9, 80, 85);
Chart1.ChartAreas["ChartArea1"].InnerPlotPosition = new ElementPosition(7, 0, 90, 90);
//创建第3个series的额外Y轴
CreateYAxis(Chart1, Chart1.ChartAreas["ChartArea1"], Chart1.Series["Series3"], 16,8);
//月生产动态
/// <summary>
/// 创建Y轴
/// </summary>
/// <param name="chart"></param>
/// <param name="area"></param>
/// <param name="series"></param>
/// <param name="axisOffset"></param>
/// <param name="labelsSize"></param>
public void CreateYAxis(Chart chart, ChartArea area, Series series, float axisOffset, float labelsSize)
{
// 根跟据原来的区域创建CreateArea
ChartArea areaSeries = chart.ChartAreas.Add("ChartArea_" + series.Name);
areaSeries.BackColor = Color.Transparent;
areaSeries.BorderColor = Color.Transparent;
areaSeries.Position.FromRectangleF(area.Position.ToRectangleF());
areaSeries.InnerPlotPosition.FromRectangleF(area.InnerPlotPosition.ToRectangleF());
areaSeries.AxisX.MajorGrid.Enabled = false;
areaSeries.AxisX.MajorTickMark.Enabled = false;
areaSeries.AxisX.LabelStyle.Enabled = false;
areaSeries.AxisY.MajorGrid.Enabled = false;
areaSeries.AxisY.MajorTickMark.Enabled = false;
areaSeries.AxisY.LabelStyle.Enabled = false;
areaSeries.AxisY.IsStartedFromZero = area.AxisY.IsStartedFromZero;
series.ChartArea = areaSeries.Name;
// 在新的区域创建Y轴
ChartArea areaAxis = chart.ChartAreas.Add("AxisY_" + series.ChartArea);
areaAxis.BackColor = Color.Transparent;
areaAxis.BorderColor = Color.Transparent;
areaAxis.Position.FromRectangleF(chart.ChartAreas[series.ChartArea].Position.ToRectangleF());
areaAxis.InnerPlotPosition.FromRectangleF(chart.ChartAreas[series.ChartArea].InnerPlotPosition.ToRectangleF());
areaAxis.AxisY.Title = "单位:万吨";
// 创建一个指定的Series副本
Series seriesCopy = chart.Series.Add(series.Name + "_Copy");
seriesCopy.ChartType = series.ChartType;
foreach (DataPoint point in series.Points)
{
seriesCopy.Points.AddXY(point.XValue, point.YValues[0]/10000);
}
// 隐藏副本 series
seriesCopy.IsVisibleInLegend = false;
seriesCopy.Color = Color.Transparent;
seriesCopy.BorderColor = Color.Transparent;
seriesCopy.ChartArea = areaAxis.Name;
// 禁用drid线及tickmarks
areaAxis.AxisX.LineWidth = 0;
areaAxis.AxisX.MajorGrid.Enabled = false;
areaAxis.AxisX.MajorTickMark.Enabled = false;
areaAxis.AxisX.LabelStyle.Enabled = false;
areaAxis.AxisY.MajorGrid.Enabled = false;
areaAxis.AxisY.IsStartedFromZero = area.AxisY.IsStartedFromZero;
areaAxis.AxisY.LabelStyle.Font = area.AxisY.LabelStyle.Font;
// 调整区域位置
areaAxis.Position.X -= axisOffset;
areaAxis.InnerPlotPosition.X += labelsSize;
}
效果是出来了,下面就是重构了,后来终于找到一个即高效又简单的方法,那就是通过数据源来控制。在数据源中将线的值除10。这样另外的Y轴就可以满足需要了。如下图:
注意:上述方法必须在tooltip中将显示的值在乘以10要不结果是错的,还有就是将右侧的Y轴属性设置为True