2012-02-05 2 views
1

Помощь! Я потратил несколько часов на изучение этого и не могу найти решение. Я использую 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) 

ответ

1

Вы можете оставить google.setOnloadCallback и просто добавить вызов функции непосредственно в конец.

+0

Мне кажется, что это приблизило меня, но по-прежнему не загружает диаграмму. Я добавил strOutput.append ("drawChart();") и удалил строку google.setOnloadCallback. График загружается, когда загружается страница, но когда обновляется updatePanel, диаграмма исчезает, хотя теперь высота исходной диаграммы остается, тогда как перед ее исчезновением. – Andrew

+0

Есть слишком много вещей, которые могут повлиять на это. Изменен ли параметр 'chart_div' в панели обновления? Вы получаете ошибку javascript? Является ли переменная «data» отображающей правильные данные в отладчике JS вашего браузера? – Malk

+0

chart_div также заменяется на updatePanel. Если я перейду за пределы панели обновления, это не изменится, если javascript будет обновлен в updatePanel. Не получается никаких ошибок в JavaScript. Не знаете, как проверить переменную данных, могу ли я сделать это через Firebug? Я знаю, что данные верны, потому что они работают, если я удаляю updatePanel, просто не хочу, чтобы страница была обратной, и я знаю, что многие люди искали решение для этого. Кстати, мне на самом деле пришлось включить google.setOnloadCallback, потому что он не будет загружаться без него (наследовал с другого графика, удалял все остальные, чтобы помочь вывести). – Andrew

1

У меня была такая же проблема с Firefox. диаграмма сделана правильно перерисована в Chrome, IE и Safari. Я нашел решение, но это то, что я бы назвал kludge. Однако я доволен, и это работает.

Я сделал некоторое обнаружение браузера, и только для Firefox я добавил setTimeout из 10 мс вокруг вызова, чтобы перерисовать код.

Единственное другое решение, о котором я читал, это заменить UpdatePanel на JS AJAX, и я нашел это решение предпочтительным.

0

Я столкнулся с подобной проблемой, используя диаграммы Google с панелью обновлений, поэтому отправляю решение.

Javascript-код прерывается после асинхронного или частичного обновления на панели обновления. Пожалуйста, обратитесь к следующей статье, чтобы понять причину и решение: Update panel and jQuery issue.

Чтобы исправить проблему, связанную с частичным обновлением, просто добавьте следующий код в дополнение к вашему коду, чтобы повторно применить код javascript. Этот код вызывает функцию, чтобы нарисовать диаграмму следующим образом:

<script type="text/javascript"> 

    var prm = Sys.WebForms.PageRequestManager.getInstance(); 
    prm.add_endRequest(function (sender, e) { 
     if (sender._postBackSettings.panelsToUpdate != null) { 
      //Event Raised when the Async Postback is completed. 
     } 

     // Your function which draws chart 
     drawChart(); 

    }); 

</script> 
Смежные вопросы