首页 > 代码库 > MVC3_Chart_WebGrid

MVC3_Chart_WebGrid

Demo_Chart_WebGrid

 

Recently, a demo to design a table and images to display some important data.

In this day, some errors had faced and solved.

Use WebGrid to dispaly the records of table. Use Chart Class to display image.

There are no enough blogs that are complete and accurate,may are outdate or  use old tech.

 

Ok Start Now!

 

Two Part:

(1) design a table for test, create a view or procedure and input some records for test.

(2) use the view or procedure of the database, design a image by the class of chart and display all the data by the help of WebGrid.

 

Note: the Part(1) designed is to test and you can use the same method in the database of  you computer or server.

 

In this demo use the view of database,and you can use procedure too.

 

Part(1) Database 

1.Oracle SQL Developer

1.1 USE THE URSR SCOTT,CREATE TABLE METRICS and input some data (ID IS PK), you can copy them from the PR_SUM.XLS,you can copy them.

   IDSTR_YEAR_MONTHNCDRbaselinecumulativetargetcumulativetarget
12014/1/17872789999
22014/2/1658914399198
32014/3/1797922299296
42014/4/1808430299395
52014/5/1689837099494
62014/6/1489341899593
72014/7/1808049899691
82014/8/1 69 99790
92014/9/1 100 99889
102014/10/1 124 99988
112014/11/1 88 991086
122014/12/1 74 991185

 

note:PK id, create a PK,avoid some warning from VS on ODAC.

 

1.2 Open the METRICS input the data and ensure it.(Data use to test)

 

 

 

associate the record from XLs and table of database ,there are 7 items

 

test them, if success,you can do next,because the data that you have input them into table now.

And have a see ensure it.

 

 

1.3 Use the ROLE OF SYSDBA  TO CREATE VIEW and    Scheme(方案):SCOTT ,  VIEW_SUM

advice: use VIEW or PROCEDURE are not table,because use virtual can do more safe Query and much more effects.

 

 

2.MVC+ORACLE+ODAC(use the view of database )

  

 

 

 

 

 

 

 

note:Now,you can create a database Context to do much things,it‘s easy.

use the database context to display the all records by the view of databse. 

in the HomeController.cs  In the HomeController, the Action Index

 1 using MvcMetrics.DAL; 2  3 using System.Web.Helpers; 4  5   6  7 //database Context 8  9 private MetricsEntities db = new MetricsEntities();10 11  12 13  14 15  16 17         public ActionResult Index()18 19         {20 21             //ViewBag.Message = "Welcome to ASP.NET MVC!";22 23             //use VIEW from database24 25             var records = db.VIEW_SUM.ToList();26 27  28 29             var grid = new WebGrid(30 31                                 source: records,32 33                                 fieldNamePrefix: "grid_",34 35                                 defaultSort: "RELEASEDATE",// the way of sort36 37                                 canPage: true,38 39                                 canSort: true,40 41                                 ajaxUpdateContainerId: "DivGrid", // ajaxUpadate bind42 43                                 pageFieldName: "paging",44 45                                 sortDirectionFieldName: "RELEASEDATE",46 47                                  rowsPerPage: 4 //per page the count of records48 49                                   );50 51             return View(grid);52 53  54 55         }
View Code

In the view of Index,you can see that

 @{    ViewBag.Title = "Home Page";} <h2>@ViewBag.Message</h2><p>    To learn more about ASP.NET MVC visit <a href="http://asp.net/mvc" title="ASP.NET MVC Website">http://asp.net/mvc</a>.</p>

Change it.

 1 @model WebGrid 2  3   4  5 @{ 6  7     ViewBag.Title = "Test"; 8  9 }10 11  12 13 <div id="DivGrid">14 15 @Model.GetHtml(16 17         columns: @Model.Columns(18 19                      @Model.Column("ID", "NO"),20 21                      @Model.Column("STR_YEAR_MONTH", format: @<i>@item.STR_YEAR_MONTH</i>, canSort: false),22 23                      @Model.Column("NCDR", "NCDR", format: @<b><i>@item.NCDR</i></b>, canSort: false),24 25                      @Model.Column("baseline", format: @<i>@item.baseline</i>, canSort: false),26 27                      @Model.Column("cumulative",format: @<i>@item.cumulative</i>, canSort: false),28 29                      @Model.Column("target", format: @<i>@item.target</i>, canSort: false),30 31                      @Model.Column("cumulativetarget", format: @<i>@item.cumulativetarget</i>, canSort: false)),32 33        tableStyle: "grid", headerStyle: "headerStyle1",34 35        selectedRowStyle: "selectedRowStyle",36 37        caption: "List METRICS_DATA Table",38 39        displayHeader: !IsPost,40 41        fillEmptyRows: !IsPost,42 43        emptyRowCellValue: "",44 45        mode: WebGridPagerModes.All,46 47        firstText: "First",48 49        previousText: "Previous", nextText: "Next",50 51        lastText: "Last"52 53  54 55 )56 57 </div>58 59 <h3>60 61     Page Count:62 63     @Html.Encode(@Model.PageCount)64 65     <br/>66 67     Total Record:68 69     @Html.Encode(@Model.TotalRowCount)70 71 </h3>
View Code

Note: @model WebGrid,   Declare variables the you will use.

 now,you can run it,and see the record from table(Metric)

In Controller, you can create a WebGird,and set items,and others, return the WebGrid to View(MVC).

In View of MVC, you can get WebGrid and display the records.

 

In the Models ,add a class of member

1         public string Date { get; set; }2 3         public double Value { get; set; }
View Code

In the HomeController, add this Action

 Firstly, add reference System.Web.DataVisualization.

 

using MvcMetrics.Models;using System.Web.UI.DataVisualization.Charting;using System.IO;          public FileResult GetChart()        {            //NCDR,baseline,cumulative,target,cumulativetarge            //We use target make the  scale of X and Y            //use VIEW of database,get the all records            var records = db.VIEW_SUM.ToList();                        List<double> dataNCDR = new List<double>();//NCDR            List<double> databaseline = new List<double>();//baseline            List<double> datacumulative = new List<double>();//cumulative            List<Member> datatarget = new List<Member>();//target, X and Y            List<double> datacumulativetarget = new List<double>();//cumulativetarget             //spefical null,get the data for NCD,baseline,cumulative,target,cumulativetarge            foreach (var record in records)            {                //note : the start is not null,so can deal with it in this way                if (record.NCDR != null)                    dataNCDR.Add((double)record.NCDR);                 databaseline.Add((double)record.BASELINE);                 if (record.CUMULATIVE != null)                    datacumulative.Add((double)record.CUMULATIVE);                 //Member.Data is the X scale, Member.Value is the Y scale,the important is X scale                Member temp = new Member() { Date = record.STR_YEAR_MONTH, Value = http://www.mamicode.com/(double)record.TARGET };"NCDR Test MVC", Docking.Top, new System.Drawing.Font("Trebuchet MS", 14, System.Drawing.FontStyle.Bold),System.Drawing.Color.FromArgb(26, 59, 105));            Chart1.Titles.Add(t);//add Title of Chart1              //create a area of Chart1,use "Series 1" or others.            Chart1.ChartAreas.Add("Series 1");             //set Coordinate axis intervals Of X = 1            Chart1.ChartAreas[0].AxisX.Interval = 1;               Chart1.ChartAreas[0].AxisX.IntervalOffset = 1;              //the scale of X display in one line or two line when it >= 9            Chart1.ChartAreas[0].AxisX.LabelStyle.IsStaggered = false;               //change the x display Angle            Chart1.ChartAreas[0].AxisX.LabelStyle.Angle = 45;              //add Series, five .   the "Series 6" is used to make other effect            Chart1.Series.Add("Series 1");            Chart1.Series.Add("Series 2");            Chart1.Series.Add("Series 3");            Chart1.Series.Add("Series 4");            Chart1.Series.Add("Series 5");            Chart1.Series.Add("Series 6");//make other effect             //test,in one Chart, Column 1 and Line 4            Chart1.Series["Series 1"].ChartType = SeriesChartType.Column;//StackedColumn  Column            Chart1.Series["Series 2"].ChartType = SeriesChartType.Line;            Chart1.Series["Series 3"].ChartType = SeriesChartType.Line;            Chart1.Series["Series 4"].ChartType = SeriesChartType.Line;            Chart1.Series["Series 5"].ChartType = SeriesChartType.Line;             ////make other effect            Chart1.Series["Series 6"].ChartType = SeriesChartType.Point;            // display the value of the Point            Chart1.Series["Series 3"].IsValueShownAsLabel = true;            Chart1.Series["Series 5"].IsValueShownAsLabel = true;              //DataBindXY()  ,X scale,Y scale,use datatarget,"Series 4"            Chart1.Series["Series 4"].Points.DataBindXY(datatarget, "date", datatarget, "value");             //make Chart            foreach (double value in dataNCDR)            {                Chart1.Series["Series 1"].Points.AddY(value);            }               foreach (double value in databaseline)            {                Chart1.Series["Series 2"].Points.AddY(value);            }             foreach (double value in datacumulative)            {                //double effects use the "Series 3" and "Series 6"                Chart1.Series["Series 3"].Points.AddY(value);                Chart1.Series["Series 6"].Points.AddY(value);            }             foreach (double value in datacumulativetarget)            {                Chart1.Series["Series 5"].Points.AddY(value);            }              //NCDR,baseline,cumulative,target,cumulativetarge            Chart1.Series["Series 1"].Name = "NCDR";            Chart1.Series["Series 2"].Name = "baseline";            Chart1.Series["Series 3"].Name = "cumulative";            Chart1.Series["Series 4"].Name = "target";            Chart1.Series["Series 5"].Name = "cumulativetarge";             //the "Series 6" do not displey in the Legend            Chart1.Series["Series 6"].IsVisibleInLegend = false;              //X Title            Chart1.ChartAreas[0].AxisX.Title = "Date";            Chart1.ChartAreas[0].AxisX.TitleFont = new System.Drawing.Font("Anonymous Pro", 10, System.Drawing.FontStyle.Regular);             //Y Title            Chart1.ChartAreas[0].AxisY.Title = "Value";            Chart1.ChartAreas[0].AxisY.TitleFont = new System.Drawing.Font("Anonymous Pro", 10, System.Drawing.FontStyle.Regular);             //x Major Line            Chart1.ChartAreas[0].AxisX.MajorGrid.Enabled = false;            Chart1.ChartAreas[0].BorderDashStyle = ChartDashStyle.Solid;   //设置chartareas区域的边框样式                         //Border    the style of Border            Chart1.BorderSkin.SkinStyle = BorderSkinStyle.Emboss;            Chart1.BorderlineWidth = 2;            Chart1.BorderColor = System.Drawing.Color.Black;            Chart1.BorderlineDashStyle = ChartDashStyle.Solid;            Chart1.BorderWidth = 2;             //the location of Legend            Legend legend1 = new Legend();            legend1.Docking = Docking.Top;            legend1.Alignment = System.Drawing.StringAlignment.Center;             Chart1.Legends.Add(legend1);             //IO            MemoryStream imageStream = new MemoryStream();            Chart1.SaveImage(imageStream, ChartImageFormat.Png);            imageStream.Position = 0;            return new FileStreamResult(imageStream, "image/png");          }

in index.cshtml,add

 

<div>    <img src="http://www.mamicode.com/Home/GetChart" alt="Chart" /></div>

the Chart you can read it from code,enough comments can display the effect of all.

Chart, ChartArea,Series ,Legend, that you can set and make nice images.

 

At last, the IO (MemoryStream and FileStream ,ImageStream ) that are usually used to display image. 

 

Run,Result: