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日間頭を悩ませた後、私はこれに非常に「挑戦」しているので、あなたが提供できる助けがあれば大歓迎です.
乾杯、
トレイ・キャロル