介绍过基础的MSchart知识后,大家应该容易上手写代码了,最起码搞几个饼图柱状图什么的不在话下了。下面我们看看如何在实际项目中写代码。
1. 柱状图
string strSQL;
DataSet ds = new DataSet();
Chart1.ChartAreas[0].Name = "chartArea1";
Chart1.Titles.Add("chartArea1");
Chart1.Titles[0].Font = new Font("宋体", 14, FontStyle.Bold);
strSQL = "select col1,col2 from Report";
ds.Tables.Add(DBSQL.Query(strSQL, 300).Tables[0].Copy());
ds.Tables[0].TableName = "chartArea1";
if (ds.Tables[0].Rows.Count > 0)
{
Chart1.Series[0].Name = "chartArea1";
Series ser_qqgzjz = Chart1.Series[0];
ser_qqgzjz.ChartArea = "chartArea1";
ser_qqgzjz.Points.DataBind(ds.Tables["qqgzjz"].Rows, "col2", "col1", "");
ser_qqgzjz.IsValueShownAsLabel = true;
Chart1.ChartAreas["chartArea1"].AxisY.Title = "Person";
Chart1.ChartAreas["chartArea1"].AxisX.MinorGrid.LineWidth = 0;
Chart1.ChartAreas["chartArea1"].AxisX.LabelStyle.Angle = -45;
Chart1.ChartAreas["chartArea1"].AxisX.MajorGrid.LineDashStyle = ChartDashStyle.NotSet;
Chart1.ChartAreas["chartArea1"].AxisY.MajorGrid.LineDashStyle = ChartDashStyle.Dash;
}
2. 双纵坐标(含百分比)
// chart is your mschart control,srcSeriesName is the name of source series name,destSeriesName
// is the name of series you want to add,which is percent series,totalCount is the number
// which to caculator the percent
protected void TowGrid(Chart chart, string srcSeriesName, string destSeriesName, double totalCount)
{
string strChartArea = chart.Series[srcSeriesName].ChartArea;
chart.Series[srcSeriesName].ChartType = SeriesChartType.Column;
double total = totalCount;
Series destSeries = new Series(destSeriesName);
chart.Series.Add(destSeries);
destSeries.ChartType = SeriesChartType.Line;
destSeries.BorderWidth = 3;
destSeries.ChartArea = chart.Series[srcSeriesName].ChartArea;
destSeries.YAxisType = AxisType.Secondary;
chart.ChartAreas[strChartArea].AxisY2.Maximum = 100;
chart.ChartAreas[strChartArea].AxisY2.Title = "比例(%)";
chart.ChartAreas[strChartArea].AxisY2.TitleFont = new Font("新宋体", 10);
destSeries.LabelFormat = "P1";
chart.ChartAreas[strChartArea].AxisY2.MajorGrid.LineDashStyle = ChartDashStyle.NotSet;
chart.ChartAreas[strChartArea].AxisX.LabelStyle.IsEndLabelVisible = false;
double percentage = 0.0;
foreach (DataPoint pt in chart.Series[srcSeriesName].Points)
{
percentage = (pt.YValues[0] * 100.0 / total);
destSeries.Points.Add(Math.Round(percentage, 2));
}
chart.Series[destSeriesName].IsValueShownAsLabel = true;
chart.Series[destSeriesName].MarkerColor = Color.Red;
chart.Series[destSeriesName].MarkerBorderColor = Color.MidnightBlue;
chart.Series[destSeriesName].MarkerStyle = MarkerStyle.Circle;
chart.Series[destSeriesName].MarkerSize = 8;
chart.Series[destSeriesName].LabelFormat = "0.#";
}
}
///-----------------------------------------------------------------------------------------------------------------------------------------
兄弟你太帅了,我要实现的效果和你的一模一样。
我这个是在ms的实例中的一个方法,
///============================================================================
protected void Page_Load(object sender, System.EventArgs e)
{
// Populate series with random data of different scale
Random random = new Random();
DateTime date = DateTime.Now.Date;
for(int pointIndex = 0; pointIndex < 13; pointIndex++)
{
Chart1.Series["Series1"].Points.AddXY(date, random.Next(5,100));
Chart1.Series["Series2"].Points.AddXY(date, random.Next(8000, 8200));
Chart1.Series["Series3"].Points.AddXY(date, random.Next(1000,3000));
date = date.AddDays(1);
}
if(UseMultipleYAxis.Checked)
{
// Set custom chart area position
Chart1.ChartAreas["ChartArea1"].Position = new ElementPosition(25,10,68,85);
Chart1.ChartAreas["ChartArea1"].InnerPlotPosition = new ElementPosition(10,0,90,90);
// Create extra Y axis for second and third series
CreateYAxis(Chart1, Chart1.ChartAreas["ChartArea1"], Chart1.Series["Series2"], 13, 8);
CreateYAxis(Chart1, Chart1.ChartAreas["ChartArea1"], Chart1.Series["Series3"], 22, 8);
}
}
/// <summary>
/// Creates Y axis for the specified series.
/// </summary>
/// <param name="chart">Chart control.</param>
/// <param name="area">Original chart area.</param>
/// <param name="series">Series.</param>
/// <param name="axisOffset">New Y axis offset in relative coordinates.</param>
/// <param name="labelsSize">Extar space for new Y axis labels in relative coordinates.</param>
public void CreateYAxis(Chart chart, ChartArea area, Series series, float axisOffset, float labelsSize)
{
// Create new chart area for original series
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;
// Create new chart area for axis
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());
// Create a copy of specified 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]);
}
// Hide copied series
seriesCopy.IsVisibleInLegend = false;
seriesCopy.Color = Color.Transparent;
seriesCopy.BorderColor = Color.Transparent;
seriesCopy.ChartArea = areaAxis.Name;
// Disable drid lines & 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;
// Adjust area position
areaAxis.Position.X -= axisOffset;
areaAxis.InnerPlotPosition.X += labelsSize;
}