zoukankan      html  css  js  c++  java
  • web开发经验—MVC 图表Chart

    Mvc  Chart 是一个使用起来非常方便的控件,可以自定义参数,能呈现给用户很漂亮的各种统计图表;使用此图表首先要导入命名空间:System.Web.UI.DataVisualization.Charting

    此dll在vs自带的里面,它的位置: C:Program FilesReference AssembliesMicrosoftFramework.NETFrameworkv4.0System.Web.DataVisualization.dll

    效果图如下:

    由于mvc 返回的是actionResult,而此图表chart返回的是图片,所以要封装一个ImageResult,如下:

     public class ImageResult : ActionResult
        {
            public ImageResult()
            { }
    
            public ImageResult(Image image)
            {
                Image = image;
            }
    
            public ImageResult(Image image, ImageFormat format)
            {
                Image = image;
                ImageFormat = format;
            }
    
            /// <summary> 
            /// 
            /// </summary> 
            public Image Image { get; set; }
    
            /// <summary> 
            /// 指定图像的文件格式 
            /// </summary> 
            public ImageFormat ImageFormat { get; set; }
    
            public override void ExecuteResult(ControllerContext context)
            {
                if (Image == null)
                    throw new ArgumentNullException("Image");
    
                if (ImageFormat == null)
                    throw new ArgumentNullException("ImageFormat");
    
                context.HttpContext.Response.Clear();
    
                if (ImageFormat.Equals(ImageFormat.Gif))
                    context.HttpContext.Response.ContentType = "image/gif";
                else if (ImageFormat.Equals(ImageFormat.Jpeg))
                    context.HttpContext.Response.ContentType = "image/jpeg";
                else if (ImageFormat.Equals(ImageFormat.Png))
                    context.HttpContext.Response.ContentType = "image/png";
                else if (ImageFormat.Equals(ImageFormat.Bmp))
                    context.HttpContext.Response.ContentType = "image/bmp";
                else if (ImageFormat.Equals(ImageFormat.Tiff))
                    context.HttpContext.Response.ContentType = "image/tiff";
                else if (ImageFormat.Equals(ImageFormat.Icon))
                    context.HttpContext.Response.ContentType = "image/vnd.microsoft.icon";
                else if (ImageFormat.Equals(ImageFormat.Wmf))
                    context.HttpContext.Response.ContentType = "image/wmf";
    
                Image.Save(context.HttpContext.Response.OutputStream, ImageFormat);
            }
        }

    后台代码如下:

       #region MVC Chart
    
            public ActionResult MVCChart()
            {
                return View();
            }
    
            public ActionResult ChartView()
            {
                return PartialView();
            }
            public ActionResult ZhuChart()
            {
                System.Web.UI.DataVisualization.Charting.Chart chart = new System.Web.UI.DataVisualization.Charting.Chart();
                chart.Width = 750;
                chart.Height = 400;
                chart.RenderType = RenderType.ImageTag;
                chart.Palette = ChartColorPalette.BrightPastel;
                Title t = new Title("活动数量分布", Docking.Top, new System.Drawing.Font("Trebuchet MS", 14, System.Drawing.FontStyle.Bold), System.Drawing.Color.FromArgb(26, 59, 105));
                chart.Titles.Add(t);
    
                chart.ChartAreas.Add("Subject");
                chart.ChartAreas[0].AxisX.Interval = 1;   //设置X轴坐标的间隔为1
                chart.ChartAreas[0].AxisX.IntervalOffset = 1;  //设置X轴坐标偏移为1
                chart.ChartAreas[0].AxisX.LabelStyle.IsStaggered = false;   //设置是否交错显示,比如数据多的时间分成两行来显示
    
                chart.Series.Add("Subject");
    
                chart.Series["Subject"].Label = "#VAL";
                chart.Series["Subject"].LegendText = "活动数量";
    
                List<string> actives = new List<string>();
                for (int i = 0; i < 10; i++)
                {
                    actives.Add("活动" + i.ToString());
                }
                Random rd = new Random();
    
                foreach (var item in actives)
                {
                    chart.Series["Subject"].Points.AddXY(item, rd.Next(50, 80));
                }
    
                chart.BorderSkin.SkinStyle = BorderSkinStyle.Emboss;
                chart.BorderColor = System.Drawing.Color.FromArgb(26, 59, 105);
                chart.BorderlineDashStyle = ChartDashStyle.Solid;
                chart.BorderWidth = 2;
                // chart.BackColor = Color.Green;
                chart.Legends.Add("Legend1");
    
                MemoryStream stream = new MemoryStream();
                chart.SaveImage(stream, ChartImageFormat.Jpeg);
    
                return new ImageResult(Image.FromStream(stream), ImageFormat.Jpeg);
            }
    
            public ActionResult pieChart()
            {
                List<string> xValues = new List<string>();
                List<string> yValues = new List<string>();
                List<string> actives = new List<string>();
                for (int i = 0; i < 10; i++)
                {
                    actives.Add("活动" + i.ToString());
                }
                Random rd = new Random();
    
                foreach (var item in actives)
                {
                    xValues.Add(item);
                    yValues.Add(rd.Next(10, 30).ToString());
                }
    
                System.Web.UI.DataVisualization.Charting.Chart pieChar = new System.Web.UI.DataVisualization.Charting.Chart();
                pieChar.Series.Add("Default");
                pieChar.Series["Default"].Points.DataBindXY(xValues, yValues);
                pieChar.Series["Default"].Label = "#AXISLABEL #VAL";
                pieChar.Series["Default"].LegendText = "#AXISLABEL #PERCENT{P1}";
                Title pieTitle = new Title("加分项活动比例", Docking.Top, new System.Drawing.Font("Trebuchet MS", 14, System.Drawing.FontStyle.Bold), System.Drawing.Color.FromArgb(26, 59, 105));
                pieChar.Titles.Add(pieTitle);
    
                pieChar.Width = 380;
                // Set Doughnut chart type
                pieChar.Series["Default"].ChartType = SeriesChartType.Pie;
                // Set labels style
                pieChar.Series["Default"]["PieLabelStyle"] = "Inside";
                // Set Doughnut radius percentage
                pieChar.Series["Default"]["DoughnutRadius"] = "70";
                // Explode data point with label "Italy"
                //pieChar.Series["Default"].Points[4]["Exploded"] = "true";
                // Enable 3D
                pieChar.ChartAreas.Add("ChartArea1");
                pieChar.ChartAreas["ChartArea1"].Area3DStyle.Enable3D = true;
    
                // Disable the Legend
                pieChar.Legends.Add("Lengenedpie");
                pieChar.Legends[0].Enabled = true;
    
                MemoryStream stream = new MemoryStream();
                pieChar.SaveImage(stream, ChartImageFormat.Jpeg);
    
                return new ImageResult(Image.FromStream(stream), ImageFormat.Jpeg);
            }
    
            public ActionResult lineChart()
            {
                System.Web.UI.DataVisualization.Charting.Chart chart = new System.Web.UI.DataVisualization.Charting.Chart();
                chart.Width = 830;
                chart.Height = 500;
                chart.RenderType = RenderType.ImageTag;
                chart.Palette = ChartColorPalette.BrightPastel;
                Title t = new Title("污水处理实时曲线", Docking.Top, new System.Drawing.Font("Trebuchet MS", 14, System.Drawing.FontStyle.Bold), System.Drawing.Color.FromArgb(26, 59, 105));
                chart.Titles.Add(t);
                chart.ChartAreas.Add("Default");
    
                List<string> actives = new List<string>();
                for (int i = 0; i < 5; i++)
                {
                    actives.Add("活动" + i.ToString());
                }
    
                Random rd = new Random();
                foreach (var item in actives)
                {
                    chart.Series.Add(item.ToString());
    
    
                    chart.Series[item.ToString()].LegendText = item;
                    chart.Series[item.ToString()].ChartType = SeriesChartType.Line;
                    chart.Series[item.ToString()].XValueType = ChartValueType.DateTime;
    
                    for (int i = 0; i < 10; i++)
                    {
                        chart.Series[item.ToString()].Points.AddXY(DateTime.Now.AddDays(0 - i).ToOADate(), rd.Next(10, 100));
                    }
                }
    
                chart.ChartAreas["Default"].AxisX.LabelStyle.IsStaggered = false;
                chart.ChartAreas["Default"].AxisX.LabelStyle.Format = "HH:mm";
    
                chart.BorderColor = System.Drawing.Color.FromArgb(26, 59, 105);
                chart.BorderlineDashStyle = ChartDashStyle.Solid;
                chart.BorderWidth = 2;
                chart.Legends.Add("Legend1");
                chart.ChartAreas["Default"].AxisX.IntervalAutoMode = IntervalAutoMode.VariableCount;
    
                MemoryStream stream = new MemoryStream();
                chart.SaveImage(stream, ChartImageFormat.Jpeg);
                return new ImageResult(Image.FromStream(stream), ImageFormat.Jpeg);
            }
            #endregion

    前台页面加载图表可以用ajax,代码如下:

    MVCChart 页面的代码:
    
    @{
        ViewBag.Title = "MVCChart";
    }
    <script type="text/javascript">
        $(function () {
            loadChart();
        })
    
        function loadChart() {
            $("#zhu").load("/Report/ChartView");
        }
    </script>
    <div id="zhu" style="100%"></div>
    
    ChartView的页面代码:
    
    @{
        ViewBag.Title = "ZhuView";
    }
    <table style=" 100%">
        <tr>
            <td>
                <img src="@Url.Action("ZhuChart")" alt="柱状图"/>
            </td>
        </tr>
        <tr>
            <td>
                <img src="@Url.Action("pieChart")" alt="饼状图"/>
            </td>
        </tr>
        <tr>
            <td>
                <img src="@Url.Action("lineChart")" alt="曲线图"/>
            </td>
        </tr> 
    </table>
  • 相关阅读:
    ADO.NET改进版
    H面试程序(11): 判断字符串是否包含子串问题
    H面试程序(12): 输出字符串中第一个只出现一次的字母
    Hadoop CLI MiniCluster
    hdu 3061 (最大权闭合图)
    CF 338 D GCD Table(CRT)
    【Todo】Nodejs学习计划
    【转载】游戏并发编程的讨论 & Nodejs并发性讨论 & 语法糖术语
    Jedis(Java+Redis) Pool的使用
    【Todo】Apache-Commons-Pool及对象池学习
  • 原文地址:https://www.cnblogs.com/wangchengshen/p/3950963.html
Copyright © 2011-2022 走看看