2012-09-24 41 views
1

我在這裏有一些相當簡單的代碼,但我不能爲我的生活弄清楚爲什麼它不工作。UpdatePanel.Update()方法不會更新UpdatePanel控件的內容?

我有一個名爲Update.aspx網頁,其中包含以下HTML:

<asp:ScriptManager ID="ScriptManager1" runat="server"> 
</asp:ScriptManager> 

<div> 
    Non Panel <%= Date.Now.ToLongTimeString%> 
</div> 
<asp:UpdatePanel ID="UpdatePanel1" runat="server" ChildrenAsTriggers="False" UpdateMode="Conditional"> 
    <ContentTemplate> 
     <asp:Label ID="lbl" runat="server">Updates in 5</asp:Label> 
    </ContentTemplate> 
</asp:UpdatePanel> 

後面的代碼看起來是這樣的:

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load 
     Dim t As New Timers.Timer 
     t.Interval = 5000 
     AddHandler t.Elapsed, AddressOf raiseupdate 
     t.Start() 
    End Sub 

    Private Sub raiseupdate(ByVal sender As Object, ByVal e As System.EventArgs) 
     sender.stop() 
     lbl.Text = Date.Now.ToLongTimeString 
     UpdatePanel1.Update() 
    End Sub 

這就是我期待發生:該頁面顯示更新面板中的文字「5中的更新」。計時器過去後,調用raiseupdate()方法,並調用更新面板update(),刷新更新面板的內容。

實際情況是這樣的:計時器過去了,更新面板update()方法行已到達,但數據似乎永遠不會回到頁面。也就是說,「5中的更新」一詞永遠不會被當前時間所取代。

所以我想,我已經遇到了一些關於update()方法實際做什麼的基本誤解,但我無法弄清楚我出錯的地方。我能做些什麼來完成這項工作?

+0

ASP.NET中的線程(本質上是多線程的)並不是我所說的_fairly simple_ 。爲什麼不使用['Ajax Timer控件'](http://ajax.net-tutorials.com/controls/timer-control/)?定時器和線程:http://stackoverflow.com/a/1436331/284240 –

+0

因爲我正在探索擴展此示例的可能性,以便我們可以在異步請求和更新updatepanel(s)返回時。 _那麼它會變得複雜。 –

回答

2

看起來像兩個更新..一個從更新面板和一個來自計時器是搞砸你的代碼。

相反,你可以使用AJAX定時器和添加爲一個AsyncPostBack觸發。這應該爲你做的工作..

<asp:ScriptManager ID="ScriptManager1" runat="server"> 
</asp:ScriptManager> 

<div> 
    Non Panel <%= Date.Now.ToLongTimeString%> 
</div> 
<asp:Timer ID="Timer1" OnTick="Timer1_Tick" runat="server" Interval="5000" /> 

<asp:UpdatePanel ID="UpdatePanel1" runat="server" ChildrenAsTriggers="False" UpdateMode="Conditional"> 
    <ContentTemplate> 
     <asp:Label ID="lbl" runat="server">Updates in 5</asp:Label> 
    </ContentTemplate> 
    <Triggers> 
    <asp:AsyncPostBackTrigger ControlID="Timer1" /> 
    </Triggers> 
</asp:UpdatePanel> 

你VB代碼看起來像這樣

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load 

End Sub 

Private Sub Timer1_Tick(ByVal sender As Object, ByVal e As System.EventArgs) 
    lbl.Text = Date.Now.ToLongTimeString 

End Sub 

如果這是行不通的,你可以手動調用Timer_tick事件中的Update()

+0

靈感!這個答案使我的方向完全不同,但最終我認爲我可以實現我想用你的方法。 –