Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/mercurial/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
仅使用Javascript就可以动态填充google图表_Javascript_Html_Charts_Google Visualization_Webbrowser Control - Fatal编程技术网

仅使用Javascript就可以动态填充google图表

仅使用Javascript就可以动态填充google图表,javascript,html,charts,google-visualization,webbrowser-control,Javascript,Html,Charts,Google Visualization,Webbrowser Control,我在我的C#项目中使用Google Charts API(使用CefSharp的WebBrowser),它可以处理硬编码的数据,但每当我尝试使用data.addRows()以友好方式填充它时,我就会遇到问题。我需要一些简单的东西,比如外部的csv/json,这样就可以在C#内部运行(WebBrowser非常有限,有时会出现错误),但每个解决方案都告诉我通过php服务器或类似的更“复杂”的东西来实现这一点。那么,有没有一种方法可以仅仅使用JavaScript和外部文件(或其他不同但可行的文件)来填

我在我的C#项目中使用Google Charts API(使用CefSharp的WebBrowser),它可以处理硬编码的数据,但每当我尝试使用data.addRows()以友好方式填充它时,我就会遇到问题。我需要一些简单的东西,比如外部的csv/json,这样就可以在C#内部运行(WebBrowser非常有限,有时会出现错误),但每个解决方案都告诉我通过php服务器或类似的更“复杂”的东西来实现这一点。那么,有没有一种方法可以仅仅使用JavaScript和外部文件(或其他不同但可行的文件)来填充该图表

这就是代码,如果有用的话:

<html>
  <head>
    <script type="text/javascript" src="https://www.gstatic.com/charts/loader.js"></script>
    <script type="text/javascript">
      google.charts.load('current', {packages:["orgchart"]});
      google.charts.setOnLoadCallback(drawChart);


      function drawChart() {
        var data = new google.visualization.DataTable();
        data.addColumn('string', 'Name');
        data.addColumn('string', 'Manager');
        data.addColumn('string', 'ToolTip');

        // For each orgchart box, provide the name, manager, and tooltip to show.
        data.addRows([['Alice', 'Mike', ''],['Bob', 'Jim', 'Bob Sponge'],['Carol', 'Bob', '']]);

        // Create the chart.
        var chart = new google.visualization.OrgChart(document.getElementById('chart_div'));
        // Draw the chart, setting the allowHtml option to true for the tooltips.
        chart.draw(data, {'allowHtml':true});
      }
   </script>
    </head>
  <body>
    <div id="chart_div"></div>
  </body>
</html>

load('current',{packages:[“orgchart”]});
google.charts.setOnLoadCallback(drawChart);
函数绘图图(){
var data=new google.visualization.DataTable();
data.addColumn('string','Name');
data.addColumn('string','Manager');
data.addColumn('string','ToolTip');
//对于每个orgchart框,提供要显示的名称、管理器和工具提示。
addRows(['Alice'、'Mike'、''、'Bob'、'Jim'、'Bob Sponge']、['Carol'、'Bob'、'');
//创建图表。
var chart=new google.visualization.OrgChart(document.getElementById('chart_div'));
//绘制图表,为工具提示将allowHtml选项设置为true。
draw(数据,{'allowtml':true});
}
Obs:CefSharp WebBrowser只是将上述代码作为普通HTML文件调用,并在C#应用程序中运行


谢谢大家!

我也做过类似的事情,但我一直在使用google charts API的
arrayToDataTable()
方法,但我相信这也可以做到。不过,你需要依靠C#。我想要彻底,所以这是一个大问题。我非常乐意澄清,因为我确信其中至少有一部分会措词不当/令人困惑

TLDR

  • 创建一个类来保存数据点,并创建一种将它们表示为列表的方法
  • 在控制器类中,创建一个方法,该方法返回一个列表,其中包含表示为列表的数据点。将列表列表转换为JSON并将其发布到URL端点
  • 在cshtml中使用ajax从该端点读取json数据
  • 将读取的json放入AddRows方法中
  • 聚会
  • 这将涉及到.cshtml、主控制器以及任何您正在提取数据的地方

  • 无论您在哪里提取数据
  • 我的案子有点复杂。但基本上我有一个方法,它只返回一个类型为
    object
    的列表,其中包含这些对象,表示为列表。(例如,
    [,]

    如果您可以生成一个数据点列表,在c#端表示为列表,那么您就成功了

  • 控制器类
  • 假设您使用的是ASP.net MVC,那么您将拥有一个支持控制器类来保存您的控制C#

    一旦你有了一个object类型的list,其中包含数据点,表示为list,你就可以很容易地使用JSonConvert.SerializeObject()方法将其转换成JSON:

              public ActionResult GetChartData_All_Week()
              {
                  var dataPointsList = this.myDataSource.GetMyDataPointList();
                  var convertedJson = JsonConvert.SerializeObject(dataPointsList, new JsonSerializerSettings()
                  {
                      //Not Needed, I just like to throw out any values that are null.
                      NullValueHandling = NullValueHandling.Ignore 
                  }); 
    
                  return Content(convertedJson);
    
    Route("Index/Path/To/Post/To")]
    public ActionResult GetChartData_All_Week()
    
    重要我们将在下一步中使用ajax,因此我们需要此操作结果方法上方的神奇的
    [Route]
    属性:

              public ActionResult GetChartData_All_Week()
              {
                  var dataPointsList = this.myDataSource.GetMyDataPointList();
                  var convertedJson = JsonConvert.SerializeObject(dataPointsList, new JsonSerializerSettings()
                  {
                      //Not Needed, I just like to throw out any values that are null.
                      NullValueHandling = NullValueHandling.Ignore 
                  }); 
    
                  return Content(convertedJson);
    
    Route("Index/Path/To/Post/To")]
    public ActionResult GetChartData_All_Week()
    
    所有艰难的事情现在都完成了。如果您启动应用程序并访问上面定义的路线(对我来说是
    /Index/Charts/All/Week
    ),您应该会在那里看到类似以下内容的JSON数据:

    [["07/04/2020",25.5,44.0],["07/05/2020",25.600000381469727,45.0],["07/06/2020",25.5,44.0],...["07/08/2020",25.5,43.0]]
    
    如果你不这样做,那么下一部分就行不通了请始终记住,这是我们需要的列表列表

  • cshtml、AJAX和jQuery的魔力 你的图表大部分已经在那里了。如果它使用的是您发布的示例数据,这将是super ez。在
    drawChart()
    方法中,将在
    data.AddRows()调用之前添加以下内容
  • 现在你应该拥有它!页面和数据源将需要刷新以绘制添加的任何新数据,但这将为您提供一个动态大小的点列表。我遇到的最困难的部分是将数据格式化为列表列表。我建议将
    CS List ToList()
    方法添加到任何与我的
    Weather\u Entry
    类等效的方法中,以便将所有重要数据点按顺序放入列表*。这样做很好,也很容易做到:

    public List<object> GetMyDataPointList(){
         var myDataPointList = new List<MyDataPointType>();
         myDataPointList = this.GetMyListOfDataPoints();
         List<object> turnMeIntoJSON = new List<object>();
         myDataPointList.ForEach(dp => turnMeIntoJSON.Add(dp.ToList));
        return turnMeIntoJSON;
    }
    
    public List GetMyDataPointList(){
    var myDataPointList=新列表();
    myDataPointList=this.GetMyListOfDataPoints();
    List turnMeIntoJSON=新列表();
    ForEach(dp=>turnMeIntoJSON.Add(dp.ToList));
    返回Turnmeintoson;
    }
    

    祝你好运

    代码到底有什么问题?没有任何内容呈现到
    图表\u div
    ?此代码有效。我只想从外部文件(csv、json、甚至txt)填充data.addrows(),检查是否使用csv…非常详细的答案。我要补充澄清的唯一一点是,在您的示例中,ajax调用使用的是jQuery。@CodyLohse,谢谢!我是一个完全不懂网络的人,我完全不知道我在使用jQuery(尽管我听说过)。更新帖子!