Эта статья является зеркальной статьёй машинного перевода, пожалуйста, нажмите здесь, чтобы перейти к оригиналу.

Вид: 23205|Ответ: 6

[ASP.NET] Highcharts объединяет Asp.net для реализации динамических примеров отображения графов запасов данных

[Скопировать ссылку]
Опубликовано 28.06.2015 0:06:24 | | | |

Конкретный рынок применения этого примера заключается в том, что мне нужно регулярно читать цену товара из базы данных, а затем отображать её на веб-странице в виде графика, аналогично графику ценового тренда торговых инструментов в акциях.

Я использую asp.net, в сочетании с реализацией плагина Highcharts в jQuery, плагин поддерживает множество типов графики, но они статичны, и приведённые примеры нужно трансформировать, заинтересованные друзья могут зайти на официальный сайт Highcharts и посмотреть (http://www.highcharts.com/), где много демонстраций, если честно, чтобы понять мои потребности, мне стоит использовать Highstock, Однако, посмотрев на пример с динамическим обновлением Highcharts, я также понял, что мой интерфейс требований более лаконичный, поэтому в этой статье используется модель динамического обновления в Highcharts, а графический тип — сплайн. Итоговая карта эффектов выглядит следующим образом (цена Pinqijin обновляется каждые 10 секунд, а точка добавляется на линейный график каждые 10 секунд):

Достичь сбора шагов:

Создайте новый сайт с помощью VS и создайте asp.net страницу DynamicUpdate.aspx, код страницы выглядит следующим образом:


  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>
Копирование кода

Свойство Highcharts renderTo указывает на контейнеры отображения,

события представляют собой событие, которое контейнер должен зарегистрировать, где загрузка означает, что она происходит после завершения загрузки; здесь в загрузке устанавливается таймер js, который происходит каждые 10 секунд, а код в нём — запросить последний GOLD из файла dataupdate.ashx папки ajaxhandler в том же корневом каталоге, что и страница DynamicUpdate.aspx, через ajax в jQuery Вот почему я добавляю randomCode + "=" + oldrandomCode в ajax URL, потому что добавление случайного числа позволяет избежать кэширования, а flag=1 — потому что мой файл dataupdate.ashx хочет принимать несколько запросов от разных ajax, поэтому используйте flag для различия

xAxis представляет собой набор атрибутов, определённых для оси x контейнера, type — отображаемый тип текста, опционально, здесь я заполняю тип времени, здесь обратите внимание, что по умолчанию для экземпляра — GMT-время, вы также можете использовать UTC-время, но мы обычно используем пекинское время (GMT или UTC) + 8 часов = пекинское время, поэтому когда мы используем ajax для получения времени пекинского времени, нужно вычитать 8 часов из часа (здесь я также хочу поделиться своим опытом, Как преобразовать серверное время в js-время, которое можно использовать с помощью метода .getTime(), то есть вычесть серверное время из 1970-1-1, преобразовать оставшиеся дни в миллисекунды, а затем присвоить значение новому инициализированному времени с помощью метода setTime в js. Я обнаружил, что результат, полученный getTime(), неверен при инициализации js-времени напрямую в js в виде новой Date (год, месяц, день, час, минута, секунда, миллисекунда) с помощью getTime(), Что касается того, почему вычитается 1970-1-1, то это потому, что метод getTime() определяется как получение количества миллисекунд из текущего времени из 1970-1-1), когда ось x не отображается как время или её нужно определить самостоятельно, её также можно определить атрибутом категории, tickPixelInterval — плотность оси x, а метки используются для форматирования формата отображения оси x

yAxis представляет собой набор атрибутов, определённых для оси y контейнера, которые примерно совпадают с атрибутами оси x, но в Highcharts невозможно определить фиксированное значение оси y через категории, ось Highcharts автоматически генерируется на основе данных координатной точки, которые зависят от податрибута атрибута серии, например, при присвоении значения данным Максимальное значение — 300, минимальное — 100. Тогда отображение оси y будет от 100 до 300, или можно также установить максимальный или минимальный атрибут yAxis

серия представляет собой набор всех кривых, отображаемых в контейнере, здесь я показываю только одну кривую, имя — название кривой, данные — это набор ряда координатных точек кривой, x — впереди, y — сзади, это js-массив, в данном случае, поскольку ось x показывает время, свойство x массива должно быть зададено как время, но в Highcharts оно не назначается напрямую оси x, Вместо этого число миллисекунд между 1970-1-1 и определённым временем присваивается оси x для представления этого времени, поэтому нужно использовать метод getTime(), форма координатной точки оси y должна быть y = малое число * целое число, и я не понимал, почему Highcharts так делает, ведь данные о цене в этом примере обычно примерно одинаковы, поэтому мне пришлось делить на 200 при получении данных, а затем умножать на 200 при присвоении значения оси y.


<%= jsonstr %> в коде страницы — это начальные данные, которые мне нужно получить с сервера для инициализации графа, то есть 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.         }
Копирование кода

Среди них таблица TabMerPrice — это таблица информации о ценах сорта, время TMPTime, TMPPice, интервал времени TMPTime — десять секунд, я использую задание базы данных для создания записи таблицы, что происходит раз в десять секунд

AddHours(-8) предназначен для преобразования времени в пекинское время, а генерируемый формат данных — json

Код dataupdate.ashx выглядит так:


  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.         }
Копирование кода

Это примерная реализация шаговой агрегации, которая позволяет реализовывать отображение серверных данных в реальном времени с помощью графика, похожего на стандартный формат


HighCharts演示.zip (48.69 KB, Количество скачиваний: 1)


Счёт

Количество участников1МБ+1 способствовать+1 Коллапс причина
Боже мой, поздравляю + 1 + 1 Может ли арендодатель дать мне контактные данные? Это очень помогает

Смотреть все рейтинги





Предыдущий:Как перейти в режим разработчика для Android 4.4.x
Следующий:На основе Sina@ функции простой пример
Опубликовано 28.06.2015 10:34:21 |
Этот пост был последний раз отредактирован microxdd 28.06.2015 10:35

Сшивание струн — самый расточительный способ работы и может использоваться с StringBuilder. Однако рекомендуется использовать сериализацию JSON, которая может напрямую преобразовывать объекты в строки JSON. Его также можно десериализировать
Рекомендую библиотеку иконок Baidu http://echarts.baidu.com/doc/example.html
 Хозяин| Опубликовано 28.06.2015 10:54:45 |
microxdd опубликовано 28.06.2015 10:34
Сшивание струн — самый расточительный способ работы и может использоваться с StringBuilder. Однако рекомендуется использовать сериализацию JSON, которая может напрямую преобразовывать объекты в ...

Преимущество json в том, что это божественная лошадь? Я только слышал об этом
Опубликовано 28.06.2015 16:02:07 |
Опубликовано 28.06.2015 10:54
Преимущество json в том, что это божественная лошадь? Я только слышал об этом

JSON — это формат данных, независимый от языка
Опубликовано 28.06.2015 16:03:36 |
Delver_Si Опубликовано 28.06.2015 16:02
JSON — это формат данных, независимый от языка

Напрямую передавать данные, необходимые для JS, из фона в формате JSON, как работать с JS
 Хозяин| Опубликовано 28.06.2015 17:33:24 |
Delver_Si Опубликовано 28.06.2015 16:03
Напрямую передавать данные, необходимые для JS, из фона в формате JSON, как работать с JS

Обучение
Опубликовано 29.06.2015 18:56:59 |
Отказ:
Всё программное обеспечение, программные материалы или статьи, публикуемые Code Farmer Network, предназначены исключительно для учебных и исследовательских целей; Вышеуказанный контент не должен использоваться в коммерческих или незаконных целях, иначе пользователи несут все последствия. Информация на этом сайте взята из Интернета, и споры по авторским правам не имеют отношения к этому сайту. Вы должны полностью удалить вышеуказанный контент с компьютера в течение 24 часов после загрузки. Если вам нравится программа, пожалуйста, поддержите подлинное программное обеспечение, купите регистрацию и получите лучшие подлинные услуги. Если есть нарушение, пожалуйста, свяжитесь с нами по электронной почте.

Mail To:help@itsvse.com