Tento článek je zrcadlovým článkem o strojovém překladu, klikněte zde pro přechod na původní článek.

Pohled: 23205|Odpověď: 6

[ASP.NET] Highcharts kombinuje Asp.net pro realizaci dynamických datových příkladů zobrazení grafů akcií

[Kopírovat odkaz]
Zveřejněno 28.06.2015 0:06:24 | | | |

Konkrétní aplikace tohoto příkladu spočívá v tom, že musím pravidelně číst cenu komodity z databáze a pak ji zobrazovat na webové stránce jako graf, podobně jako cenový trendový graf obchodních nástrojů v akciích.

Používám asp.net, v kombinaci s implementací pluginu Highcharts v jQuery, plugin podporuje mnoho typů grafiky, ale jsou statické a příklady je třeba přetvořit, zájemci mohou navštívit oficiální web Highcharts (http://www.highcharts.com/), kde je spousta dem, upřímně, abych pochopil své potřeby, měl bych použít Highstock, Po prohlédnutí příkladu dynamické aktualizace Highcharts si však také uvědomuji, že mé rozhraní požadavků je stručnější, takže tento článek používá model dynamické aktualizace v Highcharts a grafický typ je spline. Konečná mapa efektů je následující (cena Pinqijinu se aktualizuje každých 10 sekund a do čárového grafu se každých 10 sekund přidává bod):

Zvyšujte krok na světě:

Vytvořte nový web pomocí VS a vytvořte asp.net stránku DynamicUpdate.aspx, kód stránky je následující:


  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>
Kopírovat kód

Vlastnost Highcharts renderTo označuje zobrazovací kontejnery,

events představuje událost, kterou musí kontejner zaregistrovat, kde načítání znamená, že nastává po dokončení načítání, zde je v načítání nastaven časovač js, který nastává jednou za 10 sekund, a kód v něm slouží k požadavku na nejnovější GOLD ze souboru dataupdate.ashx složky ajaxhandler ve stejném kořenovém adresáři jako DynamicUpdate.aspx stránka přes ajax v jQuery Cenová data této variety, tady je důvod, proč přidávám randomCode + "=" + oldrandomCode do URL ajax, protože přidání náhodného čísla může zabránit cachování, a flag=1 je proto, že můj dataupdate.ashx soubor chce přijímat více požadavků od různých ajaxů, takže používám flag k rozlišení

xAxis představuje kolekci atributů definovaných pro x-osu kontejneru, typ představuje zobrazovaný typ textu, volitelné, zde vyplňuji typ času, zde si všimněte, že výchozí pro instanci je GMT čas, můžete také použít UTC čas, ale my obecně používáme pekingský čas (GMT nebo UTC) + 8 hodin = pekingský čas, takže když použijeme AJAX, abychom zjistili, že čas je pekingský čas, měli bychom od hodiny odečíst 8 hodin (zde také chci sdílet jednu zkušenost, Jak převést server time na js čas, který lze použít metodou .getTime(), tedy odečíst server time od 1970-1-1, převést zbývající dny na milisekundy a pak přiřadit hodnotu nově inicializovanému času pomocí metody setTime v js. Zjistil jsem, že výsledek získaný getTime() je nesprávný pro inicializaci js času přímo v js ve formě nového Date (rok, měsíc, den, hodina, minuta, sekunda, milisekunda) pomocí getTime(), Pokud jde o to, proč se 1970-1-1 odečítá, je to proto, že definice metody getTime() je získat počet milisekund od aktuálního času z 1970-1-1). Když osa x není zobrazena jako čas nebo ji musíte definovat sami, může být také definována podle atributu kategorie, tickPixelInterval představuje hustotu osy x a štítky slouží k formátování zobrazovacího formátu osy x

yAxis představuje soubor atributů definovaných pro y-osu kontejneru, která je přibližně stejná jako atributy osy x, ale v Highcharts není možné definovat pevnou hodnotu osy y pomocí kategorií, osa y v Highcharts je automaticky generována na základě daných dat o souřadnicovém bodě, což závisí na podatributu atributu série, například když přiřadíte hodnotu datům, maximální hodnota je 300 a minimální hodnota 100. Pak bude zobrazení osy y mezi 100 a 300, nebo můžete také nastavit atribut max či min pro yAxis

série představuje kolekci všech křivek zobrazených v kontejneru, zde ukazuji pouze jednu křivku, název představuje název křivky, data představují kolekci řady souřadnicových bodů křivky, x je před nimi, y je za ní, je to js pole, v tomto případě protože osa x ukazuje čas, takže vlastnost x objektu pole musí být nastavena na čas, ale ve Highcharts není čas přímo přiřazen ose x, Místo toho je počet milisekund mezi 1970-1-1 a určitým časem přiřazen ose x, aby tento čas reprezentoval, takže je třeba použít metodu getTime(), tvar souřadnicového bodu na ose y musí být y = malé číslo * celočíselná forma, a nechápal jsem, proč to Highcharts musel dělat, protože cenová data varianty v tomto příkladu jsou obecně podobná, takže jsem musel při získávání dat dělit 200 a při přiřazování hodnoty ose y násobit 200.


<%= jsonstr %> v kódu stránky jsou počáteční data, která potřebuji získat ze serveru k inicializaci grafu, tedy generování stránky v CS


  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.         }
Kopírovat kód

Mezi nimi je tabulka TabMerPrice tabulka s informacemi o různých cenách, TMPTime čas, TMPPrice cena, TMPTime časový interval je deset sekund, používám databázovou úlohu k vytvoření záznamu tabulky, což se děje jednou za deset sekund

AddHours(-8) slouží k převodu času na pekingský čas a generovaný datový formát je json formát

Kód dataupdate.ashx vypadá takto:


  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.         }
Kopírovat kód

Jedná se o hrubou implementaci agregace kroků, která umožňuje zobrazit data na serveru v reálném čase pomocí grafu podobného formátu stock


HighCharts演示.zip (48.69 KB, Počet stažení: 1)


Partitura

Počet účastníků1MB+1 přispět+1 Zhroucení důvod
Mužský bože, gratuluji + 1 + 1 Může mi pronajímatel dát kontaktní údaje? Hodně by to pomohlo?

Zobrazit všechna hodnocení





Předchozí:Jak se dostat do vývojářského režimu pro Android 4.4.x
Další:Na základě Sina@ funkce jednoduchý příklad
Zveřejněno 28.06.2015 10:34:21 |
Tento příspěvek byl naposledy upraven microxdd dne 28. 6. 2015 v 10:35

Šití provázků je nejplýtvavější výkonem a lze ho použít se StringBuilderem. Doporučuje se však používat serializaci JSON, která dokáže přímo převádět objekty na řetězce JSON. Může být také deserializován
Doporučuji Baidu ikonovou knihovnu http://echarts.baidu.com/doc/example.html
 Pronajímatel| Zveřejněno 28.06.2015 10:54:45 |
microxdd zveřejněno 28. 6. 2015 10:34
Šití provázků je nejplýtvavější výkonem a lze ho použít se StringBuilderem. Doporučuje se však používat JSON serializaci, která dokáže přímo převádět objekty do ...

Výhodou jsonu je, že je to božský kůň? O tomhle jsem slyšel jen
Zveřejněno 28.06.2015 16:02:07 |
Publikováno 28. 6. 2015 v 10:54
Výhodou jsonu je, že je to božský kůň? O tomhle jsem slyšel jen

JSON je datový formát, který je jazykově nezávislý
Zveřejněno 28.06.2015 16:03:36 |
Delver_Si Zveřejněno 28. 6. 2015 16:02
JSON je datový formát, který je jazykově nezávislý

Přímo přenášet data potřebná pro JS z pozadí ve formátu JSON, jak s JS jednat
 Pronajímatel| Zveřejněno 28.06.2015 17:33:24 |
Delver_Si Zveřejněno 28. 6. 2015 16:03
Přímo přenášet data potřebná pro JS z pozadí ve formátu JSON, jak s JS jednat

Učení
Zveřejněno 29.06.2015 18:56:59 |
Zřeknutí se:
Veškerý software, programovací materiály nebo články publikované organizací Code Farmer Network slouží pouze k učení a výzkumu; Výše uvedený obsah nesmí být používán pro komerční ani nelegální účely, jinak nesou všechny důsledky uživatelé. Informace na tomto webu pocházejí z internetu a spory o autorská práva s tímto webem nesouvisí. Musíte výše uvedený obsah ze svého počítače zcela smazat do 24 hodin od stažení. Pokud se vám program líbí, podporujte prosím originální software, kupte si registraci a získejte lepší skutečné služby. Pokud dojde k jakémukoli porušení, kontaktujte nás prosím e-mailem.

Mail To:help@itsvse.com