Introduction
In our previous article we have seen in detail about how to draw Bar Chart in MVC web Application. In this article we will see how to draw Line Chart for MVC application using HTML5 Canvas, JQuery, WEB API, and AngularJS.
In this series we will see one-by-one in detail starting from:
- MVC Dynamic Bar Chart using WEB API, AngularJS and JQuery
- MVC Dynamic Line Chart using WEB API, AngularJS and JQuery
- MVC Dynamic Pie Chart using WEB API, AngularJS and JQuery
- MVC Dynamic Line&Bar Chart using WEB API, AngularJS and JQuery
- MVC Dynamic Donut Chart using WEB API, AngularJS and JQuery
- MVC Dynamic Bubble Chart using WEB API, AngularJS and JQuery
Our Chart Features
- Chart Source Data: Using WEB API and AngularJS we will be loading chart data from database to a Combobox. In our JQuery we will be plotting chart details from the Combobox.
- Chart Number of Category: Chart Items will be dynamically loaded from database. Here we will plot all the Items in Combobox. It’s good to plot fewer than 12 items per chart.
- Chart Title Text: User can add their own Chart Title and dynamically change the titles if required. Here in our example we will draw the Title Textbox text at the Bottom of the Chart. (User can redesign and customize as per your requirements if needed).
- Chart Water Mark Text: In some cases we need to add our Company name as Water Mark to our Chart. Here in our example we will draw the Water mark Textbox text at the center of the Chart. (User can redesign and customize as per your requirements if needed).
- Chart Company LOGO: User can add their own Company logo to the Chart.(Here for sample we have added my own image as a Logo at the Top left corner.( User can redesign and customize as per your requirements if needed.).
- Chart Alert Image Display: If the “Alert On” radio button is checked we will display the Alert Image. If the “Alert Off” radio button is clicked then the Alert Image will not be displayed. In JQuery we have declared alertCheckValue = 90; and we check the plot data with this aleartcheckValue and if the plot value is greater than this check value then we will display the alert image in the legend.
What is the use of Alert Image?
Let’s consider a real time project. For example we need to display the chart for a Manufacturing factory with production result as Good and Bad. For example if production result for each quality value is above 90 we need to display the Alert green Image and if the quality value is below 90 then we need to display the Red Image with label bars.
This Alert Image will be easy to identify each quality result with good or bad. (Here for a sample we have used for quality check and display green and red image, but users can customize as per your requirement and add your own image and logics.)
- Save Chart as Image: User can save the chart as Image.
- Chart Theme: Here we have created 2 themes; Blue and Green for our Chart. We can see both theme outputs here. User can also add any numbers of theme as they require.
Blue Theme
Green Theme
In this Article we have two parts:
- Chart Item and Value Insert/Update to database, Select Chart Item and Value to Combobox from database using WEB API, AngularJS.
- Using JQuery Draw our own Chart to HTML5 Canvas tag in our MVC page.
Prerequisites
- Visual Studio 2015: You can download it from here.
Code Part
In Code part we can see three steps:
Step 1: Explains about how to create a sample Database, Table, Stored procedure to select, Insert and Update Chart data to SQL Server.
Step 2: Explains about how to create a WEB API to get the data and bind the result to MVC page using AngularJS.
Step 3: Explains about how to draw our own Chart to our MVC Web application using JQuery.
Step 1: Script to create Table and Stored Procedure
We will create a ItemMaster table under the Database ‘ItemsDB. The following is the script to create a database, table and sample insert query. Run this script in your SQL Server. I have used SQL Server 2014.
- USEMASTER
- GO
-
-
- IFEXISTS(SELECT [name] FROMsys.databasesWHERE [name] ='ItemsDB')
- DROPDATABASE ItemsDB
- GO
-
- CREATEDATABASE ItemsDB
- GO
-
- USE ItemsDB
- GO
-
-
-
-
- IFEXISTS(SELECT [name] FROMsys.tablesWHERE [name] ='ItemMaster')
- DROPTABLE ItemMaster
- GO
-
- CREATETABLE [dbo].[ItemMaster](
- [ItemID] INTIDENTITYPRIMARYKEY,
- [ItemName] [varchar](100)NOTNULL,
- [SaleCount] [varchar](10)NOTNULL
- )
-
-
- INSERTINTO ItemMaster([ItemName],[SaleCount])
- VALUES ('Item1','100')
-
- INSERTINTO ItemMaster([ItemName],[SaleCount])
- VALUES ('Item2','82')
-
- INSERTINTO ItemMaster([ItemName],[SaleCount])
- VALUES ('Item3','98')
-
- INSERTINTO ItemMaster([ItemName],[SaleCount])
- VALUES ('Item4','34')
-
- INSERTINTO ItemMaster([ItemName],[SaleCount])
- VALUES ('Item5','68')
-
- select*from ItemMaster
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- CREATEPROCEDURE [dbo].[USP_Item_Select]
- (
- @ItemName VARCHAR(100)=''
- )
- AS
- BEGIN
- SELECT ItemName,
- SaleCount
- FROM ItemMaster
- WHERE
- ItemName like @ItemName +'%'
- OrderBY ItemName
- END
- GO
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- CREATEPROCEDURE [dbo].[USP_Item_Edit]
- (
- @ItemName VARCHAR(100)='',
- @SaleCount VARCHAR(10)=''
-
- )
- AS
- BEGIN
- IFNOTEXISTS(SELECT*FROM ItemMaster WHERE ItemName=@ItemName)
- BEGIN
-
- INSERTINTO ItemMaster([ItemName],[SaleCount])
- VALUES (@ItemName,@SaleCount)
-
- Select'Inserted'as results
- return;
- END
- ELSE
- BEGIN
- Update ItemMaster SET
- SaleCount=@SaleCount
- WHERE ItemName=@ItemName
- Select'Updated'as results
- return;
- END
- Select'Error'as results
- END
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- CREATEPROCEDURE [dbo].[USP_ItemMaxMin_Select]
- (
- @ItemName VARCHAR(100)=''
- )
- AS
- BEGIN
- SELECTMIN(convert(int,SaleCount))as MinValue,
- MAX(convert(int,SaleCount))as MaxValue
- FROM ItemMaster
- WHERE
- ItemName like @ItemName +'%'
-
- END
- GO
Step 2: Create your MVC Web Application in Visual Studio 2015 After installing our Visual Studio 2015 click Start, then Programs and select Visual Studio 2015 - Click Visual Studio 2015. Click New, then Project, select Web and then select
ASP.NET Web Application. Enter your project name and click OK.
Select MVC, WEB API and click OK.
Now we have created our MVC Application and as a next step we add our SQL server database as Entity Data Model to our application.
Add Database using ADO.NET Entity Data Model
Right click our project and click Add -> New Item.
Select Data->Select ADO.NET Entity Data Model> Give the name for our EF and click Add.
Select EF Designer from database and click next.
Here click New Connection and provide your SQL-Server Server Name and connect to your database.
Here we can see we have given our SQL server name, Id and PWD and after it connected we have selected the data base as ItemsDB as we have created the Database using my SQL Script.
Click next and select our tables that need to be used and click finish.
Here we can see we have selected our table ItemMasters and all needed Stored Procedures, after selecting click Finish.
Once Entity has been created, in the next step we add WEB API to our controller and write function to select/Insert/Update and Delete.
Steps to add our WEB API Controller Right Click Controllers folder-> Click Add-> Click Controller.
As we are going to create our WEB API Controller. Select Controller and Add Empty WEB API 2 Controller. Give your Name to Web API controller and click ok. Here for my Web API Controller I have given name as “
StudentsController”.
As we all know Web API is a simple and easy-to-build HTTP Service for Browsers and Mobiles.
Web API has four methods as
Get/Post/Put and
Delete where,
- Get is to request for the data. (Select)
- Post is to create a data. (Insert)
- Put is to update the data.
- Delete is to delete data.
In our example we will use both Get and Post as we need to get all image name and descriptions from database and to insert new Image Name and Image Description to database.
Get Method
In our example I have used only the Get method as I am using only Stored Procedure. We need to create object for our Entity and write our Get Method to perform Select/Insert/Update and Delete operations.
Select Operation
We use get Method to get all the details of itemMaster table using entity object and we return the result as IEnumerable .We use this method in our AngularJS and bind the result in ComboBox and insert the new chart Item to Database using the Insert Method.
- publicclassItemAPIController: ApiController
- {
- ItemsDBEntities objapi = newItemsDBEntities();
-
- [HttpGet]
- publicIEnumerable < USP_Item_Select_Result > getItemDetails(string ItemName)
- {
- if (ItemName == null) ItemName = "";
- return objapi.USP_Item_Select(ItemName).AsEnumerable();
- }
-
- [HttpGet]
- publicIEnumerable < USP_ItemMaxMin_Select_Result > getItemMaxMinDetails(string ItemNM)
- {
- if (ItemNM == null) ItemNM = "";
- return objapi.USP_ItemMaxMin_Select(ItemNM).AsEnumerable();
- }
-
- [HttpGet]
- publicIEnumerable < string > insertItem(string itemName, string SaleCount)
- {
- return objapi.USP_Item_Edit(itemName, SaleCount).AsEnumerable();
- }
- }
Now we have created our Web API Controller Class. Next step we need to create our AngularJS Module and Controller. Let’s see how to create our AngularJS Controller. In Visual Studio 2015 it’s much easy to add our AngularJS Controller. Let’s see step by Step on how to create and write our AngularJS Controller.
Creating AngularJS Controller
First create a folder inside the Script Folder and we give the folder name as “
MyAngular”.
First create a folder inside the Script Folder and I given the folder name as “
MyAngular”
Now add your Angular Controller inside the folder.
Right Click the MyAngular Folder and click Add and New Item > Select Web > Select AngularJS Controller and give name to Controller.We have given my AngularJS Controller as “
Controller.js”
If the Angular JS package is missing then add the package to your project.
Right Click your MVC project and Click-> Manage NuGet Packages. Search for AngularJS and click Install.
Modules.js: Here we will add the reference to the AngularJS JavaScript and create an Angular Module named “
AngularJS_Module”.
-
-
-
-
- var app;
- (function () {
- app = angular.module("AngularJS_Module", ['ngAnimate']);
- })();
Controllers: In AngularJS Controller I have done all the business logic and returned the data from Web API to our MVC HTML page.
1. Variable declarations Firstly, we declared all the local variables that need to be used.
- app.controller("AngularJS_Controller", function($scope, $timeout, $rootScope, $window, $http, FileUploadService)
- {
- $scope.date = new Date();
-
-
-
-
-
- var app;
- (function()
- {
- app = angular.module("RESTClientModule", ['ngAnimate']);
- })();
- app.controller("AngularJS_Controller", function($scope, $timeout, $rootScope, $window, $http)
- {
- $scope.date = new Date();
- $scope.MyName = "shanu";
- $scope.sItemName = "";
- $scope.itemCount = 5;
- $scope.selectedItem = "";
- $scope.chartTitle = "SHANU Line Chart";
- $scope.waterMark = "SHANU";
- $scope.ItemValues = 0;
- $scope.ItemNames = "";
- $scope.showItemAdd = false;
- $scope.minsnew = 0;
- $scope.maxnew = 0;
- }
- }
2. Methods
Select Method,
Here we get all the data from WEB API and bind the result to our ComboBox and we have used another method to get the maximum and Minimum Value of Chart Value and bind in hidden field.
-
- selectuerRoleDetails($scope.sItemName);
-
- function selectuerRoleDetails(ItemName)
- {
- $http.get('/api/ItemAPI/getItemDetails/',
- {
- params:
- {
- ItemName: ItemName
- }
- }).success(function(data)
- {
- $scope.itemData = data;
- $scope.itemCount = $scope.itemData.length;
- $scope.selectedItem = $scope.itemData[0].SaleCount;
- }).error(function()
- {
- $scope.error = "An Error has occured while loading posts!";
- });
- $http.get('/api/ItemAPI/getItemMaxMinDetails/',
- {
- params:
- {
- ItemNM: $scope.sItemName
- }
- }).success(function(data)
- {
- $scope.itemDataMaxMin = data;
- $scope.minsnew = $scope.itemDataMaxMin[0].MinValue;
- $scope.maxnew = $scope.itemDataMaxMin[0].MaxValue;
- }).error(function()
- {
- $scope.error = "An Error has occured while loading posts!";
- });
- }
Insert Method
User can Insert or update Chart Item value by clicking Add Chart Item Details. After validation we pass the Chart Item name and Value to WEB API method to insert into our database.
-
- $scope.saveDetails = function()
- {
- $scope.IsFormSubmitted = true;
- $scope.Message = "";
- if ($scope.ItemNames == "")
- {
- alert("Enter Item Name");
- return;
- }
- if ($scope.ItemValues == "")
- {
- alert("Enter Item Value");
- return;
- }
- if ($scope.IsFormValid)
- {
- alert($scope.ItemNames);
- $http.get('/api/ItemAPI/insertItem/',
- {
- params:
- {
- itemName: $scope.ItemNames,
- SaleCount: $scope.ItemValues
- }
- }).success(function(data)
- {
- $scope.CharDataInserted = data;
- alert($scope.CharDataInserted);
- cleardetails();
- selectuerRoleDetails($scope.sItemName);
- }).error(function()
- {
- $scope.error = "An Error has occured while loading posts!";
- });
- }
- else
- {
- $scope.Message = "All the fields are required.";
- }
- };
- });
Step 3: Todraw our Chart using JQuery to our MVC page Canvas Tag
Here we will see in detail about how to draw our Line Chart on our MVC Web Application using JQuery.
Inside the Java Script declare the global variables and initialize the Canvas in JavaScript. In the code I have used comments to easily understand the declarations.
- Script Detail Explanations
- Script Global variable
- Chart Category Color Add
Adding the Chart category colors to array: Here we have fixed to 12 colors and 12 data’s to add with Line Chart. If you want you can add more from here. Here we have two sets of color combinations, one with Green base and one with Blue base. User can add as per your requirement here.
- var pirChartColor = ["#6CBB3C", "#F87217", "#EAC117", "#EDDA74", "#CD7F32", "#CCFB5D", "#FDD017", "#9DC209", "#E67451", "#728C00", "#617C58", "#64E986"];
-
-
-
-
-
- function ChangeChartColor()
- {
- if ($('#rdoColorGreen:checked').val() == "Green Theme")
- {
- pirChartColor = ["#6CBB3C", "#F87217", "#EAC117", "#EDDA74", "#CD7F32", "#CCFB5D", "#FDD017", "#9DC209", "#E67451", "#728C00", "#617C58", "#64E986"];
- lineColor = "#3090C7";
- lineOuterCircleColor = "#6CBB3C";
- }
- else
- {
- pirChartColor = ["#3090C7", "#BDEDFF", "#78C7C7", "#736AFF", "#7FFFD4", "#3EA99F", "#EBF4FA", "#F9B7FF", "#8BB381", "#BDEDFF", "#B048B5", "#4E387E"];
- lineColor = "#F87217";
- lineOuterCircleColor = "#F70D1A ";
- }
- }
Method to get X plot and Y Plot Value: here we calculate to draw our Chart item in X and in Y Axis.
-
- function getXPlotvalue(val) {
-
- return (Math.round((chartWidth) / noOfPlots)) * val + (xSpace * 1.5) - 20;
- }
-
-
- function getYPlotVale(val) {
- return chartHeight - (((chartHeight - xSpace) / maxDataVal) * val);
-
- }
Draw Legend: If the Show Legend radio button is clicked then we draw a Legend for our Chart item inside Canvas Tag and also in this method we check to display Alert Image or not.
-
- function drawLengends()
- {
- ctx.fillStyle = "#7F462C";
- ctx.fillRect(rect.startX, rect.startY, rect.w, rect.h);
-
-
-
- ctx.fillStyle = "#FFFFFF";
- rectInner.startX = rect.startX + 1;
- rectInner.startY = rect.startY + 1;
- rectInner.w = rect.w - 2;
- rectInner.h = rect.h - 2;
- ctx.fillRect(rectInner.startX, rectInner.startY, rectInner.w, rectInner.h);
- labelBarX = rectInner.startX + 4;
- labelBarY = rectInner.startY + 4;
- labelBarWidth = rectInner.w - 10;
- labelBarHeight = (rectInner.h / noOfPlots) - 5;
- colorval = 0;
-
-
-
- $('#DropDownList1 option').each(function()
- {
- ctx.fillStyle = pirChartColor[colorval];
- ctx.fillRect(labelBarX, labelBarY, labelBarWidth, labelBarHeight);
-
-
-
- if ($('#rdoAlaramOn:checked').val() == "Alert On")
- {
-
-
-
-
- if (parseInt($(this).val()) >= alertCheckValue)
- {
- ctx.drawImage(greenImage, labelBarX, labelBarY + (labelBarHeight / 3) - 4, imagesize, imagesize);
- }
- else
- {
- ctx.drawImage(redImage, labelBarX, labelBarY + (labelBarHeight / 3) - 4, imagesize, imagesize);
- }
- }
-
-
-
- ctx.fillStyle = "#000000";
- ctx.font = '10pt Calibri';
- ctx.fillText($(this).text(), labelBarX + imagesize + 2, labelBarY + (labelBarHeight / 2));
-
-
-
- labelBarY = labelBarY + labelBarHeight + 4;
-
-
-
- colorval = colorval + 1;
- });
- }
Draw Chart: This is our main Function. Here we get all the details to draw our LineChart. In this function we will draw Chart Titile, Chart Water Mark text, Chart Logo Image and finally call draw Line chart Method to draw our Line chart inside Canvas Tag.
-
-
- function drawChart()
- {
- ChangeChartColor();
-
-
-
- greenImage.src = '../images/Green.png';
- redImage.src = '../images/Red.png';
- LogoImage.src = '../images/shanu.jpg';
-
-
-
- minDataVal = $('input:text[name=hidListMin]').val();
- maxDataVal = $('input:text[name=hidListMax]').val();
-
-
-
- noOfPlots = $("#DropDownList1 option").length;
- maxValdivValue = Math.round((maxDataVal / noOfPlots));
-
-
-
- canvas = document.getElementById("canvas");
- ctx = canvas.getContext("2d");
-
-
-
- ctx.globalAlpha = 1;
- ctx.fillStyle = "#000000";
- ctx.strokeStyle = '#000000';
-
-
-
- ctx.clearRect(0, 0, canvas.width, canvas.height);
-
-
-
- chartWidth = canvas.width - xSpace;
- chartHeight = canvas.height - ySpace;
-
-
-
- if ($('#chkLegend:checked').val() == "Show Legend")
- {
- chartWidth = canvas.width - ((canvas.width / 3) - (xSpace / 2));
- chartHeight = canvas.height - ySpace - 10;
- legendWidth = canvas.width - ((canvas.width / 3) - xSpace);
- legendHeight = ySpace;
- rect.startX = legendWidth;
- rect.startY = legendHeight;
- rect.w = canvas.width / 3 - xSpace - 10;
- rect.h = canvas.height - ySpace - 10;
-
-
-
- drawLengends();
- }
-
-
-
- var chartMidPosition = chartWidth / 2 - 60;
-
-
-
-
-
-
-
- var logoXVal = canvas.width - LogoImgWidth - 10;
- var logolYVal = 0;
-
-
-
- ctx.globalAlpha = 0.6;
- ctx.drawImage(LogoImage, logoXVal, logolYVal, LogoImgWidth, LogoImgHeight);
- ctx.globalAlpha = 1;
- ctx.font = '22pt Calibri';
- ctx.fillStyle = "#15317E";
- var titletxt = $('input:text[name=txtTitle]').val();
- ctx.fillText(titletxt, chartMidPosition, chartHeight + 60);
- ctx.fillStyle = "#000000";
- ctx.font = '10pt Calibri';
-
-
-
-
-
-
- ctx.beginPath();
- ctx.moveTo(xSpace, ySpace);
-
-
-
- ctx.lineTo(xSpace, chartHeight);
-
-
-
- ctx.lineTo(chartWidth, chartHeight);
- ctx.stroke();
-
-
-
-
-
-
-
-
-
-
-
- var vAxisPoints = 0;
- var max = maxDataVal;
- max += 10 - max % 10;
- for (var i = 0; i <= maxDataVal; i += maxValdivValue)
- {
- ctx.fillStyle = fotnColor;
- ctx.font = axisfontSize + 'pt Calibri';
- ctx.fillText(i, xSpace - 40, getYPlotVale(i));
-
-
-
- ctx.beginPath();
- ctx.moveTo(xSpace, getYPlotVale(i));
- ctx.lineTo(xSpace - 10, getYPlotVale(i));
- ctx.stroke();
- vAxisPoints = vAxisPoints + maxValdivValue;
- }
-
-
-
-
-
- drawLineChart();
-
-
-
-
- var waterMarktxt = $('input:text[name=txtWatermark]').val();
-
-
-
- ctx.globalAlpha = 0.1;
- ctx.font = '86pt Calibri';
- ctx.fillStyle = "#000000";
- ctx.fillText(waterMarktxt, chartMidPosition - 40, chartHeight / 2);
- ctx.font = '10pt Calibri';
- ctx.globalAlpha = 1;
-
-
- }
Draw LineChart: In this function we get all item names and values using foreach of ComboBoxand; here we plot all values and draw line charts using the ComboBox values.
- function drawLineChart()
- {
-
- ctx.lineWidth = 3;
- var value = $('select#DropDownList1 option:selected').val();
- ctx.beginPath();
-
- ctx.fillStyle = "#FFFFFF";
- ctx.strokeStyle = '#FFFFFF';
- ctx.moveTo(getXPlotvalue(0), getYPlotVale(value));
- ctx.fillStyle = "#000000";
- ctx.font = '12pt Calibri';
- ctx.fillText(value, getXPlotvalue(0), getYPlotVale(value) - 12);
- var ival = 0;
- $('#DropDownList1').val($('#DropDownList1 option').eq(0).val());
- $('#DropDownList1 option').each(function(i)
- {
- if (ival > 0)
- {
- ctx.lineTo(getXPlotvalue(ival), getYPlotVale($(this).val()));
- ctx.stroke();
- ctx.fillStyle = "#000000";
- ctx.font = '12pt Calibri';
- ctx.fillText($(this).val(), getXPlotvalue(ival), getYPlotVale($(this).val()) - 16);
- }
- ival = ival + 1;
- ctx.fillStyle = lineColor;
- ctx.strokeStyle = lineColor;
- });
-
-
- ival = 0;
- $('#DropDownList1 option').each(function(i)
- {
- ctx.fillStyle = lineOuterCircleColor;
- ctx.strokeStyle = lineOuterCircleColor;
- ctx.beginPath();
- ctx.arc(getXPlotvalue(ival), getYPlotVale($(this).val()), 7, 0, Math.PI * 2, true);
- ctx.fill();
- ctx.fillStyle = lineInnerCircleColor;
- ctx.strokeStyle = lineInnerCircleColor;
- ctx.beginPath();
- ctx.arc(getXPlotvalue(ival), getYPlotVale($(this).val()), 4, 0, Math.PI * 2, true);
- ctx.fill();
- ival = ival + 1;
- });
- ctx.lineWidth = 1;
- }
Note: Run the SQL Script in your SQL Server to created DB, Table and stored procedure. In web.config change the connection string to your local SQL Server connection. In the attached zip file you can find code for both Bar Chart and for Line chart.
Tested Browsers:
Read more articles on ASP.NET: