MSChart使用之动态生成多个多行ChartArea

前台代码:

                        <asp:Chart ID="Chart1" runat="server" Height="500px" Width="1000px" BorderlineWidth="1" >
                        <Titles>
                            <asp:Title Name="Title1" runat="server" Text="设备稼动率波动图" Font="宋体,20pt"></asp:Title>
                        </Titles>
                        <legends>
                            <asp:Legend IsTextAutoFit="False" DockedToChartArea="NotSet" Name="Default" BackColor="Transparent" Font="宋体, 10pt, style=Bold">
                            </asp:Legend>
                        </legends>

                        <Series>
                        </Series>

                        <ChartAreas>
                        </ChartAreas>
                        </asp:Chart>

后台代码:包括动态生成ChartArea和保存为图片:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Data;
using System.Web.UI.DataVisualization.Charting;
using System.Text;
using Microsoft.Win32;
using System.Drawing;

public partial class MSChartTest : System.Web.UI.Page
{
    int iNowYear = DateTime.Now.Year;
    protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
            for (int i = iNowYear - 10; i < iNowYear + 10; i++)
            {
                this.DDLYear.Items.Add(i.ToString());
            }
            this.DDLYear.SelectedValue = iNowYear.ToString();
            string SQL = "select  lookup_value_code,lookup_value_Name from T_EB_DB_LOOKUP_VALUE where LOOKUP_TYPE_CODE='RES_DEV_LOCATION'";
            DataSet ds = OraHelper.GetDateDS(SQL);
            this.DDLSYS.Items.Add("");
            if (ds != null && ds.Tables.Count > 0 && ds.Tables[0].Rows.Count > 0)
            {
                //DataTable dtSYS = ds.Tables[0];
                //DataRow dr = dtSYS.NewRow();
                //dr[0] = ""; dr[1] = "";
                //dtSYS.Rows.InsertAt(dr, 0);
                //this.DDLSYS.DataSource = dtSYS;
                //this.DDLSYS.DataValueField = "lookup_value_Name";
                //this.DDLSYS.DataTextField = "lookup_value_Name";
                //this.DDLSYS.DataBind();
                for (int i = 0; i < ds.Tables[0].Rows.Count; i++)
                {
                    this.DDLSYS.Items.Add(ds.Tables[0].Rows[i]["lookup_value_Name"].ToString().Trim());
                }
            }
        }
    }

    protected void btnSearch_Click(object sender, EventArgs e)
    { 
        SearchChart();
    }

    protected void SearchChart()
    {
        Chart1.ChartAreas.Clear();
        Chart1.Series.Clear();

        DataTable dtChart = this.Getdt();
        //this.GridView1.DataSource = dtChart;
        //this.GridView1.DataBind();
        if (dtChart != null && dtChart.Rows.Count>0)
        {
            DataView dv = dtChart.DefaultView;
            DataTable dtDeviceName = dv.ToTable(true, "DEVICE_NAME");//零件列表,ChartArea数 
            DataSet ds = new DataSet();
            ChartArea _ChartArea = null;
            Series _SeriesJRATE = null;
            Series _SeriesDRATE = null;
            List<string> oCharAreas = new List<string>();
            float firstChartAreaY = 0;
            for (int i = 0; i < dtDeviceName.Rows.Count; i++)
            {
                string DeviceName = dtDeviceName.Rows[i]["DEVICE_NAME"].ToString();
                DataRow[] drList = dtChart.Select(" DEVICE_NAME='" + DeviceName + "' ");
                
                if (drList != null && drList.Length>0)
                {
                        DataTable dt = drList.CopyToDataTable();
                        dt.TableName = DeviceName;
                        ds.Tables.Add(dt);
                        _ChartArea = new ChartArea();
                        _ChartArea.AxisX.MajorGrid.LineColor = System.Drawing.Color.FromArgb(224, 224, 224);
                        _ChartArea.AxisX.MajorGrid.LineDashStyle = ChartDashStyle.Dash;
                        _ChartArea.AxisY.MajorGrid.LineColor = System.Drawing.Color.FromArgb(224, 224, 224);
                        _ChartArea.AxisY.MajorGrid.LineDashStyle = ChartDashStyle.Dash;
                        _ChartArea.Position.Auto = true;
                        _ChartArea.Name = DeviceName;//设定Chart Name

                        ////_ChartArea.AxisY.Title = "单位";
                        ////_ChartArea.AxisY.TitleAlignment = StringAlignment.Far;
                        ////_ChartArea.AxisX.Title = "月份";
                        ////_ChartArea.AxisX.TitleAlignment = StringAlignment.Far;

                        _ChartArea.AxisX.Minimum = 1;//起始值
                        _ChartArea.AxisX.Maximum = 12;//结束值
                        _ChartArea.AxisX.Interval = 1;//间隔
                        _ChartArea.AxisX.IntervalType = DateTimeIntervalType.Number;//间隔类型指定

                        //_ChartArea.AxisX.LabelStyle.Interval = 1; //X文本间隔
                        //_ChartArea.AxisX.LabelStyle.Font = new System.Drawing.Font("隶书", 12);
                        //_ChartArea.AxisX.MajorGrid.Interval = 1;  //X主要辅助线间隔
                        //_ChartArea.AxisX.MinorGrid.Interval = 1;//X次要辅助线间隔
                        //_ChartArea.AxisX.MinorTickMark.Interval = 1;//X次要刻度线间隔
                        //_ChartArea.AxisX.MajorTickMark.Interval = 1;//X主要刻度线间隔
                        //_ChartArea.AxisY.MinorGrid.Interval = 1;//Y次要辅助线间隔
                        //_ChartArea.AxisY.MajorGrid.Interval = 1;//Y主要辅助线间隔
                        //_ChartArea.AxisY.LabelStyle.Interval = 0.5;
                        Chart1.ChartAreas.Add(_ChartArea);

                        Title title = new Title(_ChartArea.Name, Docking.Top);
                        Chart1.Titles.Add(title);
                        title.DockedToChartArea = _ChartArea.Name;
                        title.IsDockedInsideChartArea = false;
                        title.Alignment = ContentAlignment.TopCenter;

                        _SeriesJRATE = new Series();
                        _SeriesJRATE.ChartType = SeriesChartType.Spline;
                        _SeriesJRATE.Name = DeviceName + "_SJ";
                        _SeriesJRATE.ChartArea = _ChartArea.Name;
                        _SeriesJRATE.BorderColor = System.Drawing.Color.Blue;
                        _SeriesJRATE.Color = Color.Blue;
                        _SeriesJRATE.BorderWidth = 1;
                        _SeriesJRATE.ShadowOffset = 1;
                        _SeriesJRATE.IsValueShownAsLabel = true;
                        _SeriesJRATE.MarkerStyle = MarkerStyle.Triangle;
                        _SeriesJRATE.LegendText = "稼动率";
                        if (i == 0) { _SeriesJRATE.IsVisibleInLegend = true; }
                        else{ _SeriesJRATE.IsVisibleInLegend = false; }
            
                        Chart1.Series.Add(_SeriesJRATE); //加入Series

                        _SeriesDRATE = new Series();
                        _SeriesDRATE.ChartType = SeriesChartType.Spline;
                        _SeriesDRATE.Name = DeviceName + "_SD";
                        _SeriesDRATE.ChartArea = _ChartArea.Name;
                        _SeriesDRATE.BorderColor = System.Drawing.Color.Green;
                        _SeriesDRATE.Color = Color.Green;
                        _SeriesDRATE.BorderWidth = 1;
                        _SeriesDRATE.ShadowOffset = 1;
                        _SeriesDRATE.IsValueShownAsLabel = true;
                        _SeriesDRATE.MarkerStyle = MarkerStyle.Square;
                        _SeriesDRATE.LegendText = "直接率";
                        if (i == 0) { _SeriesDRATE.IsVisibleInLegend = true; }
                        else { _SeriesDRATE.IsVisibleInLegend = false; }

                        Chart1.Series.Add(_SeriesDRATE); //加入Series
                }
            }
            int CRows = Chart1.ChartAreas.Count % 2 == 1 ? (Chart1.ChartAreas.Count / 2 + 1) : (Chart1.ChartAreas.Count / 2);
            Chart1.Height = 60 + CRows * 420;
            for (int i = 0; i < Chart1.Legends.Count; i++)
            {
                Chart1.Legends[i].Docking = Docking.Top;
                Chart1.Legends[i].Alignment = StringAlignment.Center;
            }

            Chart1.Legends[0].Position.X = (float)(((Chart1.Width.Value / 2 - 150) / Chart1.Width.Value) * 100);
            Chart1.Legends[0].Position.Y = (float)((65/ Chart1.Height.Value) * 100);
            Chart1.Legends[0].Position.Height = (float)((20 / Chart1.Height.Value) * 100);
            Chart1.Legends[0].Position.Width = (float)((320 / Chart1.Width.Value) * 100);

            ////Chart1.Legends[0].BackColor = Color.Blue;
            //Chart1.Legends[0].BorderColor = Color.Blue;
            //Chart1.Legends[0].ForeColor = Color.Blue;        

            for (int i = 0; i < Chart1.ChartAreas.Count; i++)
            {
                int RowNum = i / 2 + 1;
                if (i % 2 == 0)   //第一列
                {
                    if (i == 0) //第一行
                    {
                        Chart1.ChartAreas[i].Position.Y = Chart1.ChartAreas.Count <=2 ? 20 : 11;
                    }
                    else  //非第一行
                    {
                        Chart1.ChartAreas[i].Position.Y = Chart1.ChartAreas[i-2].Position.Y+ Chart1.ChartAreas[i-2].Position.Height;
                    }
                    Chart1.ChartAreas[i].Position.X = 0.0F;
                    Chart1.ChartAreas[i].Position.Width = 48;
                    Chart1.ChartAreas[i].Position.Height = (float)((320 / Chart1.Height.Value) * 100);
                }
                else  //第二列
                {

                    if (i == 1) //第一行
                    {
                        Chart1.ChartAreas[i].Position.Y = Chart1.ChartAreas.Count <= 2 ? 20 : 11;
                    }
                    else  //非第一行
                    {
                        Chart1.ChartAreas[i].Position.Y = Chart1.ChartAreas[i - 2].Position.Y + Chart1.ChartAreas[i - 2].Position.Height;
                    }
                    Chart1.ChartAreas[i].Position.X =50;// (float)(Chart1.Height.Value * 0.5 - 10)
                    Chart1.ChartAreas[i].Position.Width = 48;
                    Chart1.ChartAreas[i].Position.Height = (float)((320 / Chart1.Height.Value) * 100);
                }


                if (ds.Tables[i] != null && ds.Tables[i].Rows.Count > 0)
                {
                    for (int j = 0; j < ds.Tables[i].Rows.Count; j++)
                    {
                        int iM = int.Parse(ds.Tables[i].Rows[j]["MONTH"].ToString());
                        double dJ = double.Parse(ds.Tables[i].Rows[j]["JRATE"].ToString());
                        double dD = double.Parse(ds.Tables[i].Rows[j]["DRATE"].ToString());

                        Chart1.Series[Chart1.ChartAreas[i].Name + "_SJ"].Points.AddXY(iM, dJ);
                        Chart1.Series[Chart1.ChartAreas[i].Name + "_SD"].Points.AddXY(iM, dD);
                    }

                    //for (int m = 2; m <= 11; m++)
                    //{
                    //    string strM = m < 10 ? "0" + m.ToString() : m.ToString();
                    //    Chart1.Series[Chart1.ChartAreas[i].Name + "_SH"].Points.AddXY(m, 0);
                    //}
                }

            }


        }
    }

    protected DataTable Getdt()
    {
        string sYear = this.DDLYear.SelectedValue.Trim();
        string sSYS = this.DDLSYS.SelectedValue.Trim();
        int iYear = iNowYear;
        StringBuilder sb = new StringBuilder();
        sb.Append(@"SELECT NVL(TA.RESOURCE_NAME,'') DEVICE_NAME 
                        ,NVL(SL.LOOKUP_VALUE_NAME,'') INSTALL_LOCATION
                        ,SUBSTR(YEAR_MONTH,6,2) MONTH
                        ,CASE HOURS_STAT_ACT WHEN 0 THEN 0 
                        ELSE ROUND((HOURS_TRAN+HOURS_TRAN_ALLE+HOURS_PREPARE+HOURS_PLAN_CARE)*100/HOURS_STAT_ACT,2)
                        END JRATE
                        ,CASE HOURS_STAT_ACT WHEN 0 THEN 0 
                        ELSE ROUND(HOURS_TRAN*100/HOURS_STAT_ACT,2)
                        END DRATE
                        FROM RES.T_RES_BU_MOVE_REATE TM
                        LEFT JOIN RES.T_RES_BU_MOVE_REATE_D TD ON TM.MOVE_REATE_ID=TD.MOVE_REATE_ID
                        LEFT JOIN T_RES_BU_DEVICE_ACCOUNT TA
                        ON TD.RESOURCE_ID=TA.DEVICE_ACCOUNT_ID
                        LEFT JOIN T_EB_DB_LOOKUP_VALUE SL ON
                        SL.LOOKUP_VALUE_CODE=TA.INSTALL_LOCATION
                        AND SL.LOOKUP_TYPE_CODE='RES_DEV_LOCATION'
                        WHERE 1=1 ");
        if (int.TryParse(sYear, out iYear))
        {
            sb.Append(@" AND TM.YEAR_MONTH LIKE '" + iYear.ToString() + "%' ");
        }
        else { }
        if (!string.IsNullOrEmpty(sSYS))
        {
            sb.Append(@" AND TA.INSTALL_LOCATION='" + sSYS + "' ");
        }
        else { }
        sb.Append(@" ORDER BY DEVICE_NAME,MONTH ");
        //DataTable dtChart = Gateway.Default.FromCustomSql(sb.ToString()).ToDataSet().Tables[0];

        DataSet ds = OraHelper.GetDateDS(sb.ToString());
        if (ds != null && ds.Tables.Count > 0)
        {
            DataTable dtChart = ds.Tables[0];
            return dtChart;
        }
        else return null;
    }

    protected void btnClear_Click(object sender, EventArgs e)
    {
        this.DDLYear.Text = iNowYear.ToString();
        this.DDLSYS.Text ="";
    }

    protected void btnOut_Click(object sender, EventArgs e)
    {
        SearchChart();
        string sPath = Server.HtmlEncode(Request.PhysicalApplicationPath);
        string Path = sPath + "\\TempImageFiles\\波动图.jpg";
        Chart1.SaveImage(Path);
        string DownloadPath=Server.HtmlEncode(Request.ApplicationPath);
        DownloadFile(DownloadPath+"/TempImageFiles/波动图.jpg", "波动图.jpg");
    }



    /// <summary>
    /// 下载文件
    /// </summary>
    /// <param name="filename">文件物理地址</param>
    protected void DownloadFile(string filePath,string fName)
    {
        System.IO.FileInfo fi = new System.IO.FileInfo(filePath);
        string fileextname = fi.Extension;
        string DEFAULT_CONTENT_TYPE = "application/unknown";
        RegistryKey regkey, fileextkey;
        string filecontenttype;
        try
        {
            regkey = Registry.ClassesRoot;
            fileextkey = regkey.OpenSubKey(fileextname);
            filecontenttype = fileextkey.GetValue("Content Type", DEFAULT_CONTENT_TYPE).ToString();
        }
        catch
        {
            filecontenttype = DEFAULT_CONTENT_TYPE;
        }
        Response.Clear();
        Response.Charset = "utf-8";
        Response.Buffer = true;
        this.EnableViewState = false;
        Response.ContentEncoding = System.Text.Encoding.UTF8;
        Response.AppendHeader("Content-Disposition", "attachment;filename=" +
Context.Server.UrlPathEncode(fName));
        Response.ContentType = filecontenttype;
        Response.WriteFile(filePath);
        Response.Flush();
        Response.Close();

        Response.End();
    }
}

 

posted @ 2014-08-06 10:51  下雨天的马甲  阅读(1188)  评论(0编辑  收藏  举报