Watch this example on YouTube
1. Table
USE [Company]
GO
/****** Object: Table [dbo].[ChartTest] Script Date: 2021-02-09 4:17:58 PM ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[ChartTest](
[ProductName] [varchar](50) NULL,
[Month] [varchar](50) NULL,
[Amount] [int] NULL,
[MonthNumber] [int] NULL
) ON [PRIMARY]
GO
INSERT [dbo].[ChartTest] ([ProductName], [Month], [Amount], [MonthNumber]) VALUES (N'Apple', N'Jan', 20, 1)
GO
INSERT [dbo].[ChartTest] ([ProductName], [Month], [Amount], [MonthNumber]) VALUES (N'Apple', N'Feb', 40, 2)
GO
INSERT [dbo].[ChartTest] ([ProductName], [Month], [Amount], [MonthNumber]) VALUES (N'Apple', N'Mar', 22, 3)
GO
INSERT [dbo].[ChartTest] ([ProductName], [Month], [Amount], [MonthNumber]) VALUES (N'Apple', N'Apr', 44, 4)
GO
INSERT [dbo].[ChartTest] ([ProductName], [Month], [Amount], [MonthNumber]) VALUES (N'Orange', N'Jan', 55, 1)
GO
INSERT [dbo].[ChartTest] ([ProductName], [Month], [Amount], [MonthNumber]) VALUES (N'Orange', N'Feb', 22, 2)
GO
INSERT [dbo].[ChartTest] ([ProductName], [Month], [Amount], [MonthNumber]) VALUES (N'Orange', N'Mar', 33, 3)
GO
INSERT [dbo].[ChartTest] ([ProductName], [Month], [Amount], [MonthNumber]) VALUES (N'Orange', N'Apr', 88, 4)
GO
2. Stored Procedure
-- ================================================
-- Template generated from Template Explorer using:
-- Create Procedure (New Menu).SQL
--
-- Use the Specify Values for Template Parameters
-- command (Ctrl-Shift-M) to fill in the parameter
-- values below.
--
-- This block of comments will not be included in
-- the definition of the procedure.
-- ================================================
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author: <Author,,Name>
-- Create date: <Create Date,,>
-- Description: <Description,,>
-- =============================================
CREATE PROCEDURE SelectChartTest
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
-- Insert statements for procedure here
SELECT * From ChartTest
END
GO
3.Layout
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>@ViewBag.Title - My ASP.NET Application</title>
@Styles.Render("~/Content/css")
@Scripts.Render("~/bundles/modernizr")
@Scripts.Render("~/Scripts/jquery-1.10.2.min.js")
@Scripts.Render("~/Scripts/Chart.js")
@Scripts.Render("~/Scripts/Common.js")
</head>
<body>
<div class="navbar navbar-inverse navbar-fixed-top">
<div class="container">
<div class="navbar-header">
<button type="button" class="navbar-toggle" data-toggle="collapse" data-target=".navbar-collapse">
<span class="icon-bar"></span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
</button>
@Html.ActionLink("Application name", "Index", "Home", new { area = "" }, new { @class = "navbar-brand" })
</div>
<div class="navbar-collapse collapse">
<ul class="nav navbar-nav">
<li>@Html.ActionLink("Home", "Index", "Home")</li>
<li>@Html.ActionLink("About", "About", "Home")</li>
<li>@Html.ActionLink("Contact", "Contact", "Home")</li>
</ul>
@Html.Partial("_LoginPartial")
</div>
</div>
</div>
<div class="container body-content">
@RenderBody()
<hr />
<footer>
<p>© @DateTime.Now.Year - My ASP.NET Application</p>
</footer>
</div>
@Scripts.Render("~/bundles/jquery")
@Scripts.Render("~/bundles/bootstrap")
@RenderSection("scripts", required: false)
</body>
</html>
4. Common.js
jQuery.extend({
getValues: function (url) {
var result = null;
$.ajax({
url: url,
type: 'get',
contentType: "application/json; charset=utf-8",
dataType: 'json',
async: false,
success: function (data) {
result = data;
}
});
return result;
}
});
5. Model
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
namespace BarChartMulti.Models
{
public class Chart
{
public string[] labels { get; set; }
public List<Datasets> datasets { get; set; }
}
public class Datasets
{
public string label { get; set; }
public string[] backgroundColor { get; set; }
public string[] borderColor { get; set; }
public string borderWidth { get; set; }
public int[] data { get; set; }
}
}
6. Controller
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using BarChartMulti.Models;
namespace BarChartMulti.Controllers
{
public class HomeController : Controller
{
CompanyEntities db = new CompanyEntities();
public JsonResult MultiBarChartDataEF()
{
var data = db.SelectChartTest().ToList();
var uniqueProducts = from d in data orderby d.ProductName group d by d.ProductName into m select m.Key;
var uniqueMonths = from a in data orderby a.MonthNumber group a by a.Month into g select g.Key;
string[] cols = new string[] { "#FF0000", "#800000" };
int i = 0;
Chart _chart = new Chart();
_chart.labels = uniqueMonths.ToArray();
_chart.datasets = new List<Datasets>();
List<Datasets> _dataSet = new List<Datasets>();
foreach (var d in uniqueProducts)
{
var colors = new string[uniqueMonths.Count()];
for (int j = 0; j < colors.Length; j++) colors[j] = cols[i];
_dataSet.Add(new Datasets() {
label = d,
data = (from a in data where a.ProductName == d select a.Amount.Value).ToArray(),
backgroundColor =colors,
borderColor = new string[] { "#FF0000", "#800000" },
borderWidth = "1"
});
i++;
}
_chart.datasets = _dataSet;
return Json(_chart, JsonRequestBehavior.AllowGet);
}
7. Index
@{
ViewBag.Title = "Home Page";
}
<canvas id="MultiBarChart" width="400" height="100"></canvas>
<script>
var c = document.getElementById("MultiBarChart");
var ctx = c.getContext("2d");
var tData = $.getValues("/Home/MultiBarChartDataEF");
var myBarChart = new Chart(ctx, {
type: 'bar',
data: tData
});
</script>
Thank you for sharing.
ReplyDeleteI follow your steps and the chart shows up.
But I found there was one bar missing on Jan.