无法将值从C#传递给amcharts JavaScript函数

问题描述 投票:0回答:1

我在amCharts的帮助下创建了一个图表,该图表显示了他们网站上示例的温度。图表显示正确。

现在我使用C#从数据库中获取温度,我试图将值传递给温度硬编码的函数,因此我获得了动态值。但是,我刚拿到图表,针仍然在0,并没有显示温度。

到目前为止,我尝试了3种方法:

  1. 我使用了一个隐藏字段,将值分配给C#中的隐藏字段,并调用显示图表的JavaScript函数。它只显示图表。针不会改变。
  2. 我使用了脚本管理器和Web API,(我不知道Web API,只是在Internet上使用过代码),但是同样的结果却是c#中的函数不断被调用。
  3. 我将整个amCharts代码放在JavaScript函数中。我在c#中获得了值,然后使用了 String script = "window.onload = function() { UpdateTemp('" + dt.Rows[0][0].ToString()+ "'); };"; ClientScript.RegisterStartupScript(this.GetType(), "UpdateTemp", script, true); 再次显示相同的结果,地图显示针停留在0。

这是我的第三种方法的代码:

ASPX页面,JavaScript函数

<script>
 function UpdateTemp(temp) {

     am4core.ready(function() {

            // Themes begin
            am4core.useTheme(am4themes_animated);
            // Themes end

            // create chart
            var chart = am4core.create("chartdiv", am4charts.GaugeChart);
            chart.hiddenState.properties.opacity = 0; // this makes initial fade in effect

            chart.innerRadius = -25;

            var axis = chart.xAxes.push(new am4charts.ValueAxis());
            axis.min = 0;
            axis.max = 100;
            axis.strictMinMax = true;
            axis.renderer.grid.template.stroke = new am4core.InterfaceColorSet().getFor("background");
            axis.renderer.grid.template.strokeOpacity = 0.3;

            var colorSet = new am4core.ColorSet();

            var range0 = axis.axisRanges.create();
            range0.value = 0;
            range0.endValue = 50;
            range0.axisFill.fillOpacity = 1;
            range0.axisFill.fill = colorSet.getIndex(0);
            range0.axisFill.zIndex = - 1;

            var range1 = axis.axisRanges.create();
            range1.value = 50;
            range1.endValue = 80;
            range1.axisFill.fillOpacity = 1;
            range1.axisFill.fill = colorSet.getIndex(2);
            range1.axisFill.zIndex = -1;

            var range2 = axis.axisRanges.create();
            range2.value = 80;
            range2.endValue = 100;
            range2.axisFill.fillOpacity = 1;
            range2.axisFill.fill = colorSet.getIndex(4);
            range2.axisFill.zIndex = -1;

            var hand = chart.hands.push(new am4charts.ClockHand());

            // using chart.setTimeout method as the timeout will be disposed together with a chart

            chart.setTimeout(randomValue, 2000);

            function randomValue(temp) {
                hand.showValue(temp, 1000, am4core.ease.cubicOut);
                chart.setTimeout(randomValue, 2000);
            }



        }); // end am4core.ready()

    };
</script>

C#函数获取温度并调用JavaScript函数

public void BindGrid(String charttype)
{

    string constring = "Data Source=********.DOMAIN.ORG01;Initial Catalog=Temperature;Integrated Security=SSPI;";
    using (SqlConnection con = new SqlConnection(constring))
    {
        using (SqlCommand cmd = new SqlCommand("SELECT Temperature,HighestPoint,LowestPoint FROM Temperature", con))
        {
            cmd.CommandType = CommandType.Text;
            con.Open();
            DataTable dt = new DataTable();
            dt.Load(cmd.ExecuteReader());
            temp1.Value = dt.Rows[0][0].ToString();
            con.Close();
            String script = "window.onload = function() { UpdateTemp('" + dt.Rows[0][0].ToString()+ "'); };";
             ClientScript.RegisterStartupScript(this.GetType(), "UpdateTemp", script, true);

        }
    }
}

enter image description here

javascript c# amcharts gauge
1个回答
1
投票

质量代码应该修改,但我设法使其工作。我做了2个更改:

  • 1:我使用方法“PageLoad”而不是“BindGrid”(你真的需要这个吗?)
  • 2:我直接将原始温度值填充为参数(因为它是我身边的浮点数),你用简单的引号把你的datarow值搞好,用javascript解释为字符串,“hand”的方法“showValue”似乎不能容忍它。

代码:enter image description here

结果:

enter image description here

一些改进代码的想法:

  • 将您的连接字符串放在配置文件中(从不在代码中!)
  • 如果你使用“使用”无论是调用资源的“关闭”方法,它都会被它自动调用。 (在使用它之后实际上是一个try-catch-finally,最终在close中调用close;))
  • 如果可能的话,将数据访问与渲染页面分开,创建一个单独的类来管理它,它将提高代码的可读性和发展。
  • 如果未使用变量“temp1”,则将其删除。
  • 当您获得数据时(无论是源,可能是Web服务或数据库或其他),请在访问它之前检查它是否为null并记录它,它不会花费很多,并且您可以避免异常升级。
  • 我们在2019年,您可以使用Dapper直接从您的查询中获取对象而不是通用数据行。 (检查网站是否有兴趣,他们有很多有趣的教程)。

卡尔,阿里

© www.soinside.com 2019 - 2024. All rights reserved.