Cet article est un article miroir de traduction automatique, veuillez cliquer ici pour accéder à l’article original.

Vue: 23205|Répondre: 6

[ASP.NET] Highcharts combine Asp.net pour réaliser des exemples dynamiques de graphiques de stock

[Copié le lien]
Publié sur 28/06/2015 00:06:24 | | | |

Le marché spécifique de l’application pour cet exemple est que je dois lire régulièrement le prix d’une matière première dans la base de données, puis l’afficher sur la page web sous forme de graphique, similaire au graphique de tendance des prix des instruments de négociation en actions.

J’utilise asp.net, combiné à l’implémentation du plugin Highcharts dans jQuery, le plugin peut supporter de nombreux types de graphiques, mais ils sont statiques, et les exemples fournis doivent être transformés, les amis intéressés peuvent aller sur le site officiel de Highcharts pour voir (http://www.highcharts.com/), qui propose beaucoup de démos, pour être honnête, pour comprendre mes besoins, je devrais utiliser Highstock, Cependant, après avoir examiné l’exemple de mise à jour dynamique de Highcharts, je peux aussi réaliser que mon interface de besoins est plus concise, donc cet article utilise le modèle de mise à jour dynamique dans Highcharts, et le type graphique est spline. La carte finale de l’effet est la suivante (le prix de Pinqijin est mis à jour toutes les 10 secondes, et un point est ajouté au graphique linéaire toutes les 10 secondes) :

Réussissez la collecte de pas :

Créez un nouveau site web avec VS et créez une page asp.net DynamicUpdate.aspx, le code de la page est le suivant :


  1. <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="DynamicUpdate.aspx.cs"
  2.     Inherits="WebImg.DynamicUpdate" %>

  3. <!DOCTYPE HTML>
  4. <html>
  5. <head>
  6.     <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
  7.     <title>动态显示价格图例</title>
  8.     <scrip去掉t type="text/javascrip去掉t" src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js"></scrip去掉t>
  9.     <scrip去掉t type="text/javascrip去掉t">
  10.    $(function () {
  11.        $(document).ready(function () {
  12.            Highcharts.setOptions({
  13.                global: {
  14.                    useUTC: false
  15.                }
  16.            });
  17.            var chart;
  18.            chart = new Highcharts.Chart({
  19.                chart: {
  20.                    renderTo: 'container',
  21.                    type: 'spline',
  22.                    marginRight: 10,
  23.                    events: {
  24.                    load: function () {
  25.                    // set up the updating of the chart each second
  26.                    var series = this.series[0];
  27.                    setInterval(function () {
  28.                                   var randomCode = parseInt(Math.random() * 10000);
  29.                                   var oldrandomCode = parseInt(Math.random() * 10000);
  30.                                   $.ajax({
  31.                                     url: "ajaxhandler/dataupdate.ashx?" + randomCode + "=" + oldrandomCode + "&flag=1",
  32.                                     type: "get",
  33.                                     dataType: "json",
  34.                                     success: function (data, textStatus, XMLHttpRequest) {
  35.                                         var ctime = new Date();
  36.                                         ctime.setTime(parseInt(data.rows[0].times));
  37.                                         var x = ctime.getTime(), // current time
  38.                                         y = data.rows[0].price * 200;
  39.                                         series.addPoint([x, y], true, true);
  40.                                     },
  41.                                     error: function () { }
  42.                                    });
  43.                    }, 10000);
  44.                    }
  45.                }
  46.            },
  47.            title: {
  48.                text: '品旗撮合交易市场品种行情'
  49.            },
  50.            xAxis: {
  51.                         title: {
  52.                                 text: '时间'
  53.                             },
  54.                type: 'datetime',
  55.                tickPixelInterval: 150,
  56.                         labels:{formatter:function(){
  57.                             var vDate = new Date(this.value);
  58.                             return vDate.getHours()+":"+vDate.getMinutes()+":"+vDate.getSeconds();
  59.                         }}
  60.            },
  61.            yAxis: {
  62.                title: {
  63.                    text: '价格'
  64.                },
  65.                plotLines: [{
  66.                    value: 0,
  67.                    width: 1,
  68.                    color: '#808080'
  69.                }]
  70.            },
  71.            tooltip: {
  72.                formatter: function () {
  73.                    return '<b>' + this.series.name + '</b><br/>' +
  74.                         Highcharts.dateFormat('%Y-%m-%d %H:%M:%S', this.x) + '<br/>' +
  75.                         Highcharts.numberFormat(this.y, 2);
  76.                }
  77.            },
  78.            legend: {
  79.                enabled: false
  80.            },
  81.            exporting: {
  82.                enabled: false
  83.            },
  84.                     credits:{
  85.                         text:'品旗金属交易市场',
  86.                         url:'http://www.inv6.com'
  87.                     },
  88.            series: [{
  89.                name: '品旗金(GOLD)',
  90.                data: (function () {
  91.                    var data = [],
  92.                             i;
  93.                             var jsonData = <%= jsonstr %>;
  94.                    for (i = -19; i <= 0; i++) {
  95.                                 var ctime = new Date();
  96.                                 ctime.setTime(parseInt(jsonData.rows[i+19].time1));
  97.                        data.push({
  98.                             x: ctime.getTime(),
  99.                                      y: jsonData.rows[i + 19].price * 200
  100.                        });
  101.                    }
  102.                    return data;
  103.                })()
  104.            }]
  105.        });
  106.    });
  107. });
  108.     </scrip去掉t>
  109. </head>
  110. <body>
  111.     <scrip去掉t src="http://code.highcharts.com/highcharts.js"></scrip去掉t>
  112.     <scrip去掉t src="http://code.highcharts.com/modules/exporting.js"></scrip去掉t>
  113.     <div id="container" style="min-width: 400px; height: 400px; margin: 0 auto">
  114.     </div>
  115. </body>
  116. </html>
Code de copie

Rendu de la propriété Highcharts indique les conteneurs d’affichage,

events représente l’événement que le conteneur doit enregistrer, où load signifie qu’il se produit après la fin du chargement, ici un minuteur JS est défini dans le chargement, qui se produit toutes les 10 secondes, et le code qu’il contient sert à demander le dernier GOLD depuis le fichier dataupdate.ashx du dossier ajaxhandler dans le même répertoire racine que la page DynamicUpdate.aspx via ajax dans jQuery Pour les données de prix de cette variété, voici pourquoi j’ajoute randomCode + « = » + oldrandomCode dans l’URL ajax car ajouter un nombre aléatoire peut éviter la mise en cache, et flag=1 est parce que mon fichier dataupdate.ashx veut accepter plusieurs requêtes de différents ajax, donc utilisez flag pour le distinguer

xAxis représente la collection d’attributs définis pour l’axe x du conteneur, type représente le type de texte affiché, optionnel, ici je remplis le type temps, ici notez que le temps par défaut pour l’instance est l’heure GMT, vous pouvez aussi utiliser l’heure UTC, mais nous utilisons généralement l’heure de Pékin, (GMT ou UTC) + 8 heures = heure de Pékin, donc lorsque nous utilisons l’ajax pour obtenir l’heure de Pékin, nous devrions soustraire 8 heures de l’heure (ici je veux aussi partager une expérience, Comment convertir l’heure serveur en temps js pouvant être utilisé par la méthode .getTime(), c’est-à-dire soustraire l’heure serveur de 1970-1-1, convertir les jours restants en millisecondes, puis attribuer une valeur au temps nouvellement initialisé via la méthode setTime en js, j’ai constaté que le résultat obtenu par getTime() est incorrect pour initialiser un temps js directement en js sous la forme de nouvelle Date (année, mois, jour, heure, minute, seconde, milliseconde) avec getTime(), Quant à la raison pour laquelle 1970-1-1 est soustrait, c’est parce que la définition de la méthode getTime() est d’obtenir le nombre de millisecondes à partir du temps actuel de 1970-1-1), lorsque l’axe des x n’est pas affiché comme un temps ou que vous devez le définir vous-même, il peut aussi être défini par l’attribut catégories, tickPixelInterval représente la densité de l’axe des x, et les étiquettes servent à formater le format d’affichage de l’axe des x

yAxe représente un ensemble d’attributs définis pour l’axe y du conteneur, qui est à peu près identique aux attributs de l’axe x, mais dans Highcharts il n’est pas possible de définir la valeur fixe de l’axe y à travers des catégories, l’axe y de Highcharts est automatiquement généré en fonction des données de points de coordonnées données, ce qui dépend du sous-attribut de données de l’attribut série, par exemple, lorsque vous attribuez une valeur à des données. La valeur maximale est 300, et la valeur minimale est 100. Ensuite, l’affichage de l’axe y sera entre 100 et 300, ou vous pouvez aussi définir l’attribut max ou min de yAxis

La série représente la collection de toutes les courbes affichées dans le conteneur, ici je n’en montre qu’une seule, le nom représente le nom de la courbe, les données représentent la collection d’une série de points de coordonnées de la courbe, x est devant, y est derrière, c’est un tableau js, dans ce cas, parce que l’axe des x indique le temps, donc la propriété x de l’objet tableau doit être fixée au temps, mais dans Highcharts elle n’est pas directement attribuée au temps de l’axe des x, À la place, le nombre de millisecondes entre 1970-1-1 et un certain temps est attribué à l’axe des x pour représenter ce temps, donc la méthode getTime() doit être utilisée, la forme du point de coordonnées de l’axe y doit être y = petit nombre * forme entière, et je ne comprenais pas pourquoi Highcharts devait faire cela, car les données de prix de la variété dans cet exemple sont généralement à peu près identiques, donc j’ai dû diviser par 200 lors de l’obtention des données, puis multiplier par 200 lors de l’attribution d’une valeur à l’axe des y.


< %= jsonstr %> dans le code de la page est la donnée initiale que je dois obtenir du serveur pour initialiser le graphe, la génération CS de la page


  1. public string jsonstr = "";
  2.         protected void Page_Load(object sender, EventArgs e)
  3.         {
  4.             getData();
  5.         }
  6.         private void getData()
  7.         {
  8.             DataTable dtPrice = SQLDBHelper.ExecuteTable("select top 20 TMPCode,TMPTime,TMPPrice from TabMerPrice with(nolock) order by TMPTime desc");
  9.             string json = "{"rows":[";
  10.             for (int i = (dtPrice.Rows.Count-1); i >= 0; i--)
  11.             {
  12.                 json += "{"time1":"" + (Convert.ToDateTime(dtPrice.Rows[i]["TMPTime"]).AddHours(-8) - new DateTime(1970, 1, 1)).TotalMilliseconds + "","price":"" + (Convert.ToDecimal(dtPrice.Rows[i]["TMPPrice"])/200) + ""},";
  13.             }
  14.             json = json.TrimEnd(',');
  15.             json += "]}";
  16.             jsonstr = json;
  17.         }
Code de copie

Parmi eux, la table TabMerPrice est la table d’information sur les prix variés, le temps TMPTime, le prix TMPPrice, l’intervalle de temps TMPTime est de dix secondes, j’utilise un travail de base de données pour générer l’enregistrement de la table, qui se produit toutes les dix secondes

AddHours(-8) sert à convertir l’heure en heure de Pékin, et le format de données généré est le format json

Le code dataupdate.ashx ressemble à ceci :


  1. public void ProcessRequest(HttpContext context)
  2.         {
  3.             string flag = context.Request.QueryString["flag"].ToString();
  4.             switch (flag)
  5.             {
  6.                 case "1"://获取品种当前价格
  7.                     GetMerPrice(context);
  8.                     break;
  9.             }
  10.         }
  11.         private void GetMerPrice(HttpContext context)
  12.         {
  13.             context.Response.Clear();
  14.             context.Response.Buffer = true;
  15.             context.Response.ContentType = "application/json";
  16.             context.Response.ContentEncoding.GetBytes("utf-8");
  17.             DataTable dtPrice = SQLDBHelper.ExecuteTable("select top 1 TMPCode,TMPTime,TMPPrice from TabMerPrice with(nolock) order by TMPTime desc");
  18.             string json = "{"rows":[";
  19.             json += "{"times":"" + (Convert.ToDateTime(dtPrice.Rows[0]["TMPTime"]).AddHours(-8) - new DateTime(1970, 1, 1)).TotalMilliseconds + "","price":"" + (Convert.ToDecimal(dtPrice.Rows[0]["TMPPrice"]) / 200) + ""}";
  20.             json = json.TrimEnd(',');
  21.             json += "]}";
  22.             context.Response.Write(json);
  23.             context.Response.Flush();
  24.             context.Response.End();
  25.         }
Code de copie

C’est l’implémentation approximative de l’agrégation par étapes, qui permet d’afficher en temps réel les données côté serveur avec un graphique similaire au format stock


HighCharts演示.zip (48.69 KB, Nombre de téléchargements: 1)


Score

Nombre de participants1MO+1 contribuer+1 Effondrement raison
Félicitations pour le dieu masculin + 1 + 1 Le propriétaire peut-il me donner des coordonnées ? Ça aide beaucoup

Voir toutes les notes





Précédent:Comment passer en mode développeur pour Android 4.4.x
Prochain:Basé sur Sina@ fonction exemple simple
Publié sur 28/06/2015 10:34:21 |
Ce post a été modifié pour la dernière fois par microxdd le 28/06/2015 à 10:35

Coudre des cordes est la performance la plus gaspilleuse et peut être utilisé avec StringBuilder. Cependant, il est recommandé d’utiliser la sérialisation JSON, qui peut convertir directement des objets en chaînes JSON. Il peut également être désérialisé
Recommande la bibliothèque d’icônes Baidu http://echarts.baidu.com/doc/example.html
 Propriétaire| Publié sur 28/06/2015 10:54:45 |
microxdd publié le 28-06-2015 à 10:34
Coudre des cordes est la performance la plus gaspilleuse et peut être utilisé avec StringBuilder. Cependant, il est recommandé d’utiliser la sérialisation JSON, qui peut convertir directement des objets en ...

L’avantage du json, c’est que c’est un cheval divin ? Je n’ai entendu parler que de ce truc
Publié sur 28/06/2015 16:02:07 |
Publié le 28-06-2015 à 10:54
L’avantage du json, c’est que c’est un cheval divin ? Je n’ai entendu parler que de ce truc

JSON est un format de données indépendant du langage
Publié sur 28/06/2015 16:03:36 |
Delver_Si Posté le 28-06-2015 à 16:02
JSON est un format de données indépendant du langage

Transférer directement les données requises par JS depuis l’arrière-plan au format JSON, comment gérer JS
 Propriétaire| Publié sur 28/06/2015 17:33:24 |
Delver_Si Publié le 28-06-2015 à 16:03
Transférer directement les données requises par JS depuis l’arrière-plan au format JSON, comment gérer JS

Apprentissage
Publié sur 29/06/2015 18:56:59 |
Démenti:
Tous les logiciels, supports de programmation ou articles publiés par Code Farmer Network sont uniquement destinés à l’apprentissage et à la recherche ; Le contenu ci-dessus ne doit pas être utilisé à des fins commerciales ou illégales, sinon les utilisateurs assumeront toutes les conséquences. Les informations sur ce site proviennent d’Internet, et les litiges de droits d’auteur n’ont rien à voir avec ce site. Vous devez supprimer complètement le contenu ci-dessus de votre ordinateur dans les 24 heures suivant le téléchargement. Si vous aimez le programme, merci de soutenir un logiciel authentique, d’acheter l’immatriculation et d’obtenir de meilleurs services authentiques. En cas d’infraction, veuillez nous contacter par e-mail.

Mail To:help@itsvse.com