我有一個完全dynamiclly生成的頁面,有一組linkbuttons基本上在UpdatePanel切換視圖。除了當我有一個生成的按鈕需要調用一個函數來操作更新面板中的數據時,所有這些工作都很好。動態ASP.Net UpdatePanel內容涉及他們自己的AsyncPostback
的.aspx
<div>
<asp:panel runat="server" ID="buttons" />
<asp:UpdatePanel ID="UpdatePanel1" runat="server" UpdateMode="Conditional" >
<ContentTemplate>
</ContentTemplate>
</asp:UpdatePanel>
</div>
代碼隱藏
Private Sub testpage_Init(sender As Object, e As System.EventArgs) Handles Me.Init
For i As Integer = 0 To 5 'create a few dummy buttons
Dim Btn As New LinkButton
Btn.ID = "btn" & i.ToString
Btn.Text = i.ToString
AddHandler Btn.Click, AddressOf btn_Click
buttons.Controls.Add(Btn)
Dim Trgr As New AsyncPostBackTrigger 'async link them to the updatepanel
Trgr.ControlID = Btn.ID
UpdatePanel1.Triggers.Add(Trgr)
Next
End Sub
Private Sub btn_Click(sender As Object, e As System.EventArgs)
ScriptManager.GetCurrent(Me.Page).AddHistoryPoint(sender.id.ToString, sender.id.ToString, sender.id.ToString)
UpdatePanel1.ContentTemplateContainer.Controls.Add(New LiteralControl(sender.id.ToString)) 'Show it got clicked
If sender.id.ToString = "btn1" Then
Dim Btn As New Button
Btn.ID = "test"
Btn.Text = "Click me"
AddHandler Btn.Click, AddressOf subbtn_Click
UpdatePanel1.ContentTemplateContainer.Controls.Add(Btn)
End If
End Sub
Private Sub subbtn_Click(sender As Object, e As System.EventArgs)
UpdatePanel1.ContentTemplateContainer.Controls.Add(New LiteralControl("It doesn't work"))
End Sub
所以,問題是當page_init執行它不知道,它永遠不會再現按鈕被選中其中的LinkButton和反過來不會引發事件。我看到有人使用會話來存儲控件列表和/或當前幀,但我不認爲這是可接受的解決方案。當然,必須有一種方法來做到這一點。
難道我無法獲得Navigate事件之外的ScriptManager當前/上一步信息嗎?
Asp.net 4.0與最新ajax工具包。
感謝您的幫助。
啊,我忘了提及我唯一的想法是讓按鈕ID包含知道哪個部分被選中所需的信息。我從來沒有做過自定義viewstate的東西,所以我不知道有一種方法來訪問init中的數據。我以爲你必須等到它加載。我得看看那個。 – jheizer
ViewState不存在直到LoadViewState事件,但您可以在「Page_Load」之前隨時重新創建控件,並且事件仍將被觸發。老實說,如果你可以在ID中編碼一些東西,它會容易得多,如果稍微好點。 –
聽起來像按鈕ID是要走的路。我覺得很好,我提出了2個想法中的1個,但是這是唯一的選擇。明天我會考慮一下。 – jheizer