2016-10-29 2 views
0

Я пробовал почти все предлагаемые решения, которые размещены здесь и связаны с моей проблемой без везения. Я создаю несколько графиков (используя библиотеку Dygraphs). Следующий код javascript - это всего лишь небольшая часть всей функции; на самом деле я создаю 5 графиков таким образом.<%=values%> не обновляется внутри панели обновления

<script> 

    designRawGraphs(); 

    function designRawGraphs() 
    { 

       var g1 = new Dygraph(
       document.getElementById("graphdiv"), 
       [ <%=sDataForROI1Graph%> ], 
      { 
       labels: <%=sLabelsForROI1Graph%>, 
       connectSeparatedPoints: true, 
       animatedZooms: true, 
       highlightCircleSize: 3, 
       highlightSeriesOpts: { 
        highlightCircleSize: 6 
       }, 
       drawPoints: true, 
       title: 'ROI 1 - Region of Interest', 
       ylabel: 'Raw Fluorence Intensity', 
       xlabel: 'Time (seconds)' 
      } 
         ); 

    } 
</script> 

В коде позади, я сериализовать (и служить String) как sDataForROI1Graph и sLabelsForROI1Graph глобальные переменные, которые заполняются в результате запроса к базе данных в определенном формате (ожидаемая формат для Dygraphs). Этот код javascript находится внутри asp:UpdatePanel. Когда я запускаю кнопку (которая также находится внутри одной и той же UpdatePanel), запрос возвращает разные результаты, поэтому оба файла sDataForROI1Graph и sLabelsForROI1Graph изменены, но графики не перепроектированы (а именно, значения глобальных переменных не передаются от кода позади до клиентской стороны с помощью метода <% = =>). Я также объявил Trigger опцию обожженного кнопки, как показано ниже ...

<Triggers> 
     <asp:AsyncPostBackTrigger ControlID="RemoveAllbtn" /> 
    </Triggers> 

... и мой код просто просто, как показано в следующем фрагменте кода (на самом деле я повторно запустить хранимую процедуру, которая обновляет в 2 глобальные переменные sDataForROI1Graph и sLabelsForROI1Graph с новыми значениями)

Protected Sub RemoveAllbtn_Click(ByVal sender As Object, ByVal e As EventArgs) Handles RemoveAllbtn.Click 
    RemoveAll() 
End Sub 

Если удалить UpdatePanel, все работает как шарм, потому что полный пост-обратно происходит. Я попытался ввести код javascript и выполнить другие сложные предложения, но пока не нашел обходного пути.

Вопрос: почему эти две глобальные переменные недоступны с клиентской стороны, когда они вложены в UpdatePanel? Какой подход лучше всего обойти эту проблему? Я также читал о скрытых элементах Textboxes/HiddenFields/Labels/Literals, но даже эти подходы не помогли мне решить мою проблему.

EDIT

Следует признать, что предложенный ответ ниже, что мне нужно, и она отлично работает, НО после много часов проводить на мой вопрос и стучал головой о стену, я понял, что мой проблема остается, и причина слишком странная. В стороне клиента, вне UpdatePanel я создал <asp:HiddenField ID="hidfieldforROI1" runat="server"/>, что я пытаюсь получить его значение, как это

var dataforROI1 = document.getElementById('<%= hidfieldforROI1.ClientID %>').value; 

На заднем конце я устанавливаю Value к контролю hidfieldforROI1. И я получаю следующую ошибку странно:

error BC30451: 'dataforROI1' is not declared. It may be inaccessible due to its protection level.

Я был бы признателен за любые предложения.

+0

Замените 'Literal' Control? '[],' – VDWWD

+0

@VDWWD не могли бы вы сообщить мне, как получить буквенный текст на стороне клиента, используя javascript? –

+0

Вы не можете. Вы устанавливаете значение литерала в коде позади. 'sDataForROI1Graph.Text =" yourJavaScriptStringValue ";' Он дает точно такую ​​же клиентскую сторону результата, если вы будете использовать '<% = yourJavaScriptStringValue%>' – VDWWD

ответ

0

В ASPX файле

<asp:UpdatePanel ID="UpdatePanel1" runat="server"> 
    <ContentTemplate> 

     <div id="testdiv"><%= sDataForROI1Graph %></div> 
     <br /> 
     <asp:Button ID="Button1" runat="server" Text="Button" OnClick="Button1_Click"></asp:Button> 
     <br /> 
     <script type="text/javascript"> 
      function testScript() { 
       alert(document.getElementById("testdiv").innerHTML); 
       var dataforROI1 = document.getElementById('<%= hidfieldforROI1.ClientID %>').value; 
       alert(dataforROI1); 
      } 
     </script> 

    </ContentTemplate> 
</asp:UpdatePanel> 

<asp:TextBox ID="hidfieldforROI1" runat="server" Text="textBoxje"></asp:TextBox> 

А затем в код

Dim sDataForROI1Graph As String = DateTime.Now.ToString 

Sub Page_Load(ByVal Sender As System.Object, ByVal e As System.EventArgs) 
    hidfieldforROI1.Text = "Page Load" 
End Sub 

Protected Sub Button1_Click(ByVal sender As Object, ByVal e As EventArgs) 
    sDataForROI1Graph = DateTime.Now.ToString 

    ScriptManager.RegisterStartupScript(Page, Page.GetType, "testScript", "testScript();", true) 
End Sub 

Если я использую этот код, то sDataForROI1Graph обновляется после нажатия кнопки и отображается с предупреждением.

UPDATE

я изменил мой ответ немного, чтобы включить (TextBox скрытое в моем фрагменте кода, чтобы сделать визуализацию проще). Получить скрытое значение в Page_load' and in Button1_Click . The one in Button1_Click will ofcourse not show up since theis outside the UpdatePanel скрытое . But the properties are still available so you can still use hidfieldforROI1.ClientID inside the UpdatePanel`

+0

Я редактировал свой пост, потому что понял, что проблема все еще сохраняется, и причина немного отличается от моего первого объяснения. –

+0

Я обновил свой ответ, чтобы включить 'HiddenField' вне' UpdatePanel'. Но ваше сообщение об ошибке не имеет ничего общего с панелью обновлений. Либо 'dataforROI1' не существует (отсутствует' s'?> 'SDataForROI1Graph'), либо объявляется где-то без' public'? ('Public dataforROI1 As String =" myString "') – VDWWD

Смежные вопросы