2007年11月14日

Dynamic Add AsyncPostBackTrigger In UpdatePanel

最近我遇到一個需求,就是在程式中,動態去新增一個Button,然後設定它為某一個UpdatePanel的Triggers。
遇到了一些棘手的問題,所以在這邊將它整理一下。

ASPX內的程式

<asp:ScriptManager ID="ScriptManager1" runat="server" />
<asp:UpdatePanel ID="UpdatePanel1" runat="server"
UpdateMode="conditional">
    <ContentTemplate>
       
.....
    </ContentTemplate>
</asp:UpdatePanel>
<asp:Panel ID="Panel1" runat="server">
</asp:Panel>


VB內的程式

Dim AjaxButton As New System.Web.UI.WebControls.Button
AjaxButton.ID = "XXX"
AjaxButton.Text = "XXX"
AjaxButton.UseSubmitBehavior = False '為了支援FireFox
AddHandler AjaxButton.Click, AddressOf Me.OnAjaxButton_Click
Me.UpdatePanel1.ContentTemplateContainer.Controls.Add(AjaxButton)

Dim trigger As New System.Web.UI.AsyncPostBackTrigger
trigger.ControlID = AjaxButton.ID
Me._UpdatePanelQ.Triggers.Add(trigger)



上面這段Code如果寫在Page Init中,那是沒有問題的,但是如果將它移到Page_Load中,就會有問題了,
它將可能造成非同步PostBack的Error,那此時就要另外加上下面的語法了。


先在外部宣告下面這一個Method

Private Shared triggerInitMethod As Reflection.MethodInfo = GetType(System.Web.UI.UpdatePanelTrigger).GetMethod("Initialize", Reflection.BindingFlags.NonPublic Or Reflection.BindingFlags.Instance)


這段Code緊接著在第一段Code的後面,去執行UpdatePanel的Initialize事件

If System.Web.UI.ScriptManager.GetCurrent(Me).IsInAsyncPostBack = True Then
triggerInitMethod.Invoke(trigger, Nothing)
End If


大功告成...

沒有留言:

張貼留言