1

ASP.NET UpdatePanel のイベントに基づいて、クライアント側スクリプトをトリガーしています。ページが実際に更新されると機能しますが、UpdatePanel のイベントの 1 つによって同じコードがトリガーされるとまったく機能しません。Google Chart コントロールには window.onload が必要なようです。回避策はありますか?

<asp:UpdatePanel ID="UpdatePanel1" runat="server">    
<ContentTemplate >
    <asp:Timer ID="Timer1" runat="server" Enabled="False" Interval="3000" ontick="Timer1_Tick">
</asp:Timer>
    <asp:Panel ID="Panel1" runat="server" Visible="True">
        <asp:Label ID="QuestionText" runat="server" Text=""></asp:Label>
        <br />
        <asp:RadioButtonList ID="ResponseList" runat="server">
        </asp:RadioButtonList>
        <br />
        <asp:Button ID="SubmitResponse" runat="server" Text="Submit" onclick="SubmitResponse_Click" />
    </asp:Panel>
    <asp:Panel ID="Panel2" runat="server" Visible="False">
        <div>
            Thank you for taking this poll...                
        </div>
    </asp:Panel>
    <asp:Panel ID="Panel3" runat="server" Visible="False">
        <div id="chart_div">
            Google Chart showing Survey Results should appear here.
        </div>
    </asp:Panel>
</ContentTemplate>

protected void Page_PreRender(object sender, EventArgs e)
    {
        GetPoll();
        string drawGoogleChartScript = GetDrawGoogleChartsScript();

        if (!UserHasResponded(SPContext.Current.Web.CurrentUser.Name))            
        {               
            QuestionText.Text = Poll.Question;
            ResponseList.DataSource = Poll.PossibleResponses;
            ResponseList.DataBind();
            Panel1.Visible = true;
            HiddenPollId.Value = Poll.PollId;
        }
        else if(_submitButtonClicked && !_thankYouMessageHasBeenDisplayed )
        { 
            //Return and wait for the Timer event to fire
            return;
        }
        else if(!_submitButtonClicked && _thankYouMessageHasBeenDisplayed )
        {
            //The Timer event has fired
            _thankYouMessageHasBeenDisplayed = false;
            ScriptManager.RegisterStartupScript(Page, Page.GetType(), "DrawChart1", GetDrawGoogleChartsScript(), false);
        }
        else
        {
            //The user has already taken the poll - visible on every visit after they take it.
            if (Panel1.Visible == true)
            {
                Panel1.Visible = false;
            }
            if (Panel3.Visible == false)
            {
                Panel3.Visible = true;
            }

            ScriptManager.RegisterStartupScript(Page, this.Page.GetType(), "DrawChart2", GetDrawGoogleChartsScript(), false);                               
        }
    }


protected void SubmitResponse_Click(object sender, EventArgs e)
    {
        _submitButtonClicked = true;
        using(SPSite site = new SPSite(SiteUrl))
        {
            using( SPWeb web = site.RootWeb ) 
            {
                SPList responseList = web.Lists[ResponseListName];                    
                SPListItem item = responseList.AddItem();

                item["Response"] = ResponseList.SelectedItem.Text;
                item["PollId"] = HiddenPollId.Value;
                item["UserId"] = SPContext.Current.Web.CurrentUser.Name;

                item.Update();
            }
        }

        //Hide the Question
        Panel1.Visible = false;

        //Show "Thank you for taking the poll message"
        Panel2.Visible = true;

        //Start the Timer - (countdown to swith over to the results)
        Timer1.Enabled = true;

    }       



    protected void Timer1_Tick(object sender, EventArgs e)
    {
        _submitButtonClicked = false;
        _thankYouMessageHasBeenDisplayed = true;

        //Hide the "Thank you for taking the poll" message
        Panel2.Visible = false;

        //Show panel with the 'char_div' where the chart will be injected
        Panel3.Visible = true;

        //Stop the timer
        Timer1.Enabled = false;

    }

GetDrawGoogleChartsScript() 以下を文字列で返します。

    <script type='text/javascript'>
       google.load('visualization', '1.0', {'packages':['corechart']});
       google.setOnLoadCallback(drawChart);

       function drawChart(){
         data = new google.visualization.DataTable();
         data.addColumn('string', 'Agreement');
         data.addColumn('number', 'choice');
         data.addRows([['Strongly Disagree', 3],['Disagree', 1],['Neutral', 1],['Agree', 1],['Strongly Agree', 2]])
         var options = { 'title': 'My manager has taken positive steps to increase engagement since the Q12 Survey.', 'width': 400, 'height': 300 };
         var chart = new                  google.visualization.BarChart(document.getElementById('chart_div'));
         chart.draw(data, options);
    }
</script>

ASP.NET UpdatePanel を使用して、アンケートの質問 + 送信ボタンを表示し、次に「アンケートに回答していただきありがとうございます」というメッセージを表示し、最後にアンケートの結果を Google チャートに表示します。

ページが更新されるとチャートは機能しますが、非同期イベントを使用してチャートを機能させることはできません。

多くのコードを投稿していますが、本質的な問題は、Timer_Tick イベントが発生した後に Page_PreRender に再度入ると、次の行を実行することです: ScriptManager.RegisterClientScriptBlock(Page, Page.GetType(), "DrawChart1", GetDrawGoogleChartsScript() 、 間違い);

(これは、アンケートの完了後にページをリロードするときに実行されるコードと同じです。) しかし、何も起こりません! スクリプトはまったく読み込まれません。

棒グラフのパラメーターは実際には動的に計算されるため、ScriptManager.RegisterClientScriptBlock を使用してページに追加する必要があります。

ScriptManager.RegisterClientScriptBlock を呼び出す行が実行されるのを見ることはできますが、Async イベントの場合、javascript はページ ソースにもなりません。

これに4日間頭を悩ませた後、私はこれに非常に「挑戦」しているので、あなたが提供できる助けがあれば大歓迎です.

乾杯、

トレイ・キャロル

4

2 に答える 2

0

あなたの問題は、コードビハインドまたはクライアント側でコントロールの可視性を設定したという事実に関係していると思います。両方を実行して正しく機能させることはできません。これを知っていますか?この制約のために、私は多くの頭痛に悩まされてきました。

于 2012-09-18T19:45:35.407 に答える
0

Google スクリプトは に依存しませんwindow.onload。私は何が起こっていると思います:

  1. タイマー イベントが発生し、スクリプト ブロックがクライアントにレンダリングされます
  2. クライアント スクリプトは Google 視覚化ライブラリを読み込み、コールバックを起動します -->はまだ表示されていないdrawChartため、何も起こりませんPanel3
  3. タイマーが再び起動し、Panel3表示されるようになりました。google.setOnLoadCallback(drawChart)クライアント スクリプトが再度実行されますが、Google スクリプトが既に読み込まれているため、今回はコールバックがトリガーされません。

これを修正するために、簡単なテストをお勧めします。Google API が既に読み込まれているかどうかを確認します。drawChartそうでない場合は、関数を手動で呼び出します。

if (typeof google.visualization == 'undefined') {
    google.load('visualization', '1.0', {'packages':['corechart']});
    google.setOnLoadCallback(drawChart);
}
else {
    drawChart();
}

これにより、チャートが正しくレンダリングされるはずです。

于 2012-09-18T20:24:19.273 に答える