Note that there are some explanatory texts on larger screens.

plurals
  1. PO
    primarykey
    data
    text
    <p>It was a challenge, but here is how I did it. The key for me was adding the datetime stamp as part of the AJAX call in refreshChart(). That change defeated any browser or proxy caching that was preventing the chart from updating.</p> <p><strong>Index.aspx</strong></p> <pre><code>&lt;script type="text/javascript" language="javascript"&gt; $(document).ready(function() { refreshChart("#chartAlerts", "/Chart/AlertsChart"); }) .everyTime(60000, function() { refreshChart("#chartAlerts", "/Chart/AlertsChart"); }); function refreshChart(id, url) { $(id).fadeTo(1000, 0.15).attr("src", url + "?t=" + new Date().getTime()).fadeTo(1000, 1); } &lt;/script&gt; &lt;div class="DashboardBlock" id="block2"&gt; &lt;div class="DashboardBlockHeader"&gt;&lt;h2&gt;Alerts Summary&lt;/h2&gt;&lt;/div&gt; &lt;div class="DashboardBlockContent"&gt; &lt;img id="chartAlerts" alt="" src="" width="460" height="225" /&gt; &lt;/div&gt; &lt;/div&gt; </code></pre> <p><strong>Site.css</strong></p> <pre><code>.DashboardBlock { border:#000000 1px solid; margin-bottom:3px; } .DashboardBlockHeader { padding: 3px 10px 3px 10px; color: #ffffff; background-image:url(../../Content/images/blockheader_bkg.gif); background-repeat: no-repeat; cursor:move; display:block; } .DashboardBlockHeader h2 { font-size:1.09em; margin:0px 0 0px 0; padding:0; } .DashboardBlockContent { padding:5px 3px 2px 3px; } </code></pre> <p><strong>ChartController.cs</strong></p> <pre><code>public ActionResult AlertsChart() { var chart = new Chart() { Width = 460, Height = 225, ImageType = ChartImageType.Png, Palette = ChartColorPalette.BrightPastel, BackColor = Color.WhiteSmoke, RenderType = RenderType.BinaryStreaming, BackGradientStyle = GradientStyle.TopBottom, BackSecondaryColor = Color.White, AntiAliasing = AntiAliasingStyles.All, TextAntiAliasingQuality = TextAntiAliasingQuality.High }; chart.BorderSkin.SkinStyle = BorderSkinStyle.Emboss; var title = chart.Titles.Add("Main"); title.Text = "Alerts"; title.ShadowColor = Color.FromArgb(32, 0, 0, 0); title.ShadowOffset = 2; title.ForeColor = Color.FromArgb(26, 59, 105); title.Font = new Font("Segoe UI", 10f, FontStyle.Bold); var area = chart.ChartAreas.Add("ChartArea1"); area.BorderColor = Color.FromArgb(64, 64, 64, 64); area.BackSecondaryColor = Color.White; area.BackColor = Color.WhiteSmoke; area.ShadowColor = Color.Transparent; area.Area3DStyle.PointDepth = 100; area.Area3DStyle.PointGapDepth = 100; area.Area3DStyle.Rotation = 10; area.Area3DStyle.Enable3D = true; area.Area3DStyle.Inclination = 40; area.Area3DStyle.IsRightAngleAxes = false; area.Area3DStyle.WallWidth = 0; area.Area3DStyle.IsClustered = false; area.AxisY.LineColor = Color.FromArgb(64, 64, 64, 64); area.AxisY.LabelStyle.Font = new Font("Trebuchet MS", 8.25f, FontStyle.Bold); area.AxisY.LabelStyle.Format = "$#,##0"; area.AxisY.MajorGrid.LineColor = Color.FromArgb(64, 64, 64, 64); area.AxisX.LineColor = Color.FromArgb(64, 64, 64, 64); area.AxisX.LabelStyle.Font = new Font("Trebuchet MS", 8.25f, FontStyle.Bold); area.AxisX.LabelStyle.Format = "MM/dd"; area.AxisX.MajorGrid.LineColor = Color.FromArgb(64, 64, 64, 64); var legend = chart.Legends.Add("Default"); legend.Enabled = true; legend.IsTextAutoFit = true; legend.BackColor = Color.Transparent; legend.Font = new Font("Segoe Condensed", 8f, FontStyle.Regular); legend.Docking = Docking.Right; // Load from the database var history = GetAlertHistory(); if (history.RowCount &gt; 0) { chart.DataBindTable(history.DefaultView, AlertHistoryViewSchema.AlertName.FieldName); chart.Series[0].ChartType = SeriesChartType.Pie; chart.Series[0].IsValueShownAsLabel = true; chart.Series[0]["PieLabelStyle"] = "Outside"; chart.Series[0].Font = new Font("Segoe Condensed", 8.25f, FontStyle.Regular); history = GetAlertHistorySummary(); DateTime lastAlertDate = Convert.ToDateTime(history.GetColumn("LastAlertDate")); title = chart.Titles.Add(String.Format("Total Alerts: {0:#,##0} Last Alert Date: {1:MM/dd/yyyy h:mm tt}", history.GetColumn("AlertCount"), lastAlertDate)); title.Font = new Font("Segoe Condensed", 10f, FontStyle.Regular); title.ForeColor = lastAlertDate - DateTime.Now &gt; TimeSpan.FromMinutes(2) ? Color.Red : Color.Black; } else { chart.Titles.Add("There are no alerts."); } var ms = new MemoryStream(); chart.SaveImage(ms, ChartImageFormat.Png); HttpContext.Response.ExpiresAbsolute = DateTime.Now.AddDays(-1); return File(ms.GetBuffer(), @"image/png"); } private AlertHistoryView GetAlertHistory() { var obj = new AlertHistoryView(); obj.DatabaseInstanceName = "Alerts"; string serialData = HttpContext.Cache["_alertHistory"] as string; if (string.IsNullOrEmpty(serialData)) { try { obj.Query.AddResultColumn(AlertHistoryViewSchema.AlertName); obj.Aggregate.AlertID.Function = AggregateParameter.Func.Count; obj.Aggregate.AlertID.Alias = "AlertCount"; obj.Where.Date.Value = DateTime.Now.ToShortDateString(); obj.Where.Date.Operator = WhereParameter.Operand.GreaterThanOrEqual; obj.Query.AddGroupBy("AlertName"); obj.Query.AddOrderBy("AlertName", WhereParameter.Dir.ASC); obj.Query.Load(); HttpContext.Cache.Insert("_alertHistory", obj.Serialize(), null, DateTime.Now.AddMinutes(15), Cache.NoSlidingExpiration); } catch { } } else { obj.Deserialize(serialData); } return obj; } </code></pre> <p>Other tools used in the solution (but irrelevant to answer the question):</p> <ul> <li>JQuery timer plugin (<a href="http://plugins.jquery.com/project/timer" rel="nofollow noreferrer">http://plugins.jquery.com/project/timer</a>)</li> <li>EasyObjects.NET, my O/RM to retrieve data from the database (<a href="http://www.easyobjects.net" rel="nofollow noreferrer">http://www.easyobjects.net</a>)</li> <li>ASP.NET chart controls (obviously ;)</li> </ul>
    singulars
    1. This table or related slice is empty.
    plurals
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. VO
      singulars
      1. This table or related slice is empty.
    2. VO
      singulars
      1. This table or related slice is empty.
    1. This table or related slice is empty.
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload