Помощь! Я потратил несколько часов на изучение этого и не могу найти решение. Я использую API интерактивных диаграмм Google в UpdatePanel, который асинхронно обновляется, когда я изменяю выделение в раскрывающемся списке, что в конечном итоге изменяет набор данных для диаграммы Google. Проблема в том, что диаграмма исчезает при обновлении UpdatePanel. Я использую RegisterStartupScript, и я тестировал предупреждение javascript в панели обновления, чтобы подтвердить, что javascript работает в UpdatePanel, когда он обновляется, поэтому проблема кажется ограниченной только тем, что делает JavaScript javascript. Возможно, это setOnLoadCallback, на самом деле не вызывающий drawChart после обновления UpdatePanel? Не уверен, что это так или как это исправить.Интерактивные диаграммы Google не загружаются при обновлении UpdatePanel
Код, приведенный ниже, находится в общедоступном Sub, который вызывается в Page_Load, и когда выбранное значение выпадающего списка изменяется.
Dim strOutput As New StringBuilder
strOutput.Append("google.load('visualization', '1.0', { 'packages': ['corechart'] });")
strOutput.Append("google.setOnLoadCallback(drawChart);")
strOutput.Append("function drawChart() {")
strOutput.Append("var data = new google.visualization.DataTable();")
strOutput.Append("data.addColumn('string', 'Domain');")
strOutput.Append("data.addColumn('number', 'Value');")
strOutput.Append("data.addRows([")
Dim sqlSelect As New SqlClient.SqlCommand
sqlSelect.CommandText = String.Format("spAnalytics_ViewsByDomain")
sqlSelect.CommandType = CommandType.StoredProcedure
Dim dtChartData As DataTable = clsDB.FillDT(sqlSelect)
Dim commaCounter As Integer = 1
For Each row As DataRow In dtChartData.Rows
If ddlStat.SelectedValue = "hits" Then
strOutput.Append(String.Format("['{0}',{1}]", row.Item("domain"), row.Item("hit_count")))
ElseIf ddlStat.SelectedValue = "sessions" Then
strOutput.Append(String.Format("['{0}',{1}]", row.Item("domain"), row.Item("session_count")))
End If
If commaCounter <> dtChartData.Rows.Count Then strOutput.Append(",")
commaCounter = commaCounter + 1
Next
strOutput.Append("]);")
strOutput.Append("var options = { 'title': 'Views by domain',")
strOutput.Append("'width': 500,")
strOutput.Append("'height': 300")
strOutput.Append("};")
strOutput.Append("var chart = new google.visualization.PieChart(document.getElementById('chart_div'));")
strOutput.Append("chart.draw(data, options);")
strOutput.Append("}")
ScriptManager.RegisterStartupScript(litDomains, GetType(String), "blahblah", strOutput.ToString, True)
Мне кажется, что это приблизило меня, но по-прежнему не загружает диаграмму. Я добавил strOutput.append ("drawChart();") и удалил строку google.setOnloadCallback. График загружается, когда загружается страница, но когда обновляется updatePanel, диаграмма исчезает, хотя теперь высота исходной диаграммы остается, тогда как перед ее исчезновением. – Andrew
Есть слишком много вещей, которые могут повлиять на это. Изменен ли параметр 'chart_div' в панели обновления? Вы получаете ошибку javascript? Является ли переменная «data» отображающей правильные данные в отладчике JS вашего браузера? – Malk
chart_div также заменяется на updatePanel. Если я перейду за пределы панели обновления, это не изменится, если javascript будет обновлен в updatePanel. Не получается никаких ошибок в JavaScript. Не знаете, как проверить переменную данных, могу ли я сделать это через Firebug? Я знаю, что данные верны, потому что они работают, если я удаляю updatePanel, просто не хочу, чтобы страница была обратной, и я знаю, что многие люди искали решение для этого. Кстати, мне на самом деле пришлось включить google.setOnloadCallback, потому что он не будет загружаться без него (наследовал с другого графика, удалял все остальные, чтобы помочь вывести). – Andrew