以前と同じIDを持つポストバックに対して、動的に作成されたコントロールを再作成する必要があります。したがって、既に作成されたコントロールの数を格納する必要があります。良い場所はViewStateです。ちなみに、これはAJAXがない場合と同じです。
ASPX:
<asp:Button type="button" id="BtnAddButton" runat="server" Text="Add Button" />
<asp:UpdatePanel runat="server" ID="UpdatePanel1">
<ContentTemplate>
<asp:Panel ID="ButtonPanel" runat="server"></asp:Panel>
</ContentTemplate>
<Triggers>
<asp:AsyncPostBackTrigger ControlID="BtnAddButton" />
</Triggers>
</asp:UpdatePanel>
分離コード:
Public Property ButtonCount As Int32
Get
Dim VS_ButtonCount = ViewState("ButtonCount")
If VS_ButtonCount Is Nothing Then
ViewState("ButtonCount") = 0
End If
Return DirectCast(ViewState("ButtonCount"), Int32)
End Get
Set(ByVal value As Int32)
ViewState("ButtonCount") = value
End Set
End Property
Private Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
For i As Int32 = 1 To Me.ButtonCount
Dim btn As New Button
btn.ID = "Button_" & i
btn.Text = btn.ID
AddHandler btn.Click, AddressOf ButtonClick
Me.ButtonPanel.Controls.Add(btn)
Next
End Sub
Private Sub ButtonClick(ByVal sender As Object, ByVal e As EventArgs)
Dim btn = DirectCast(sender, Button)
End Sub
Protected Sub BtnAddButton_Click(ByVal sender As Object, ByVal e As EventArgs) Handles BtnAddButton.Click
Me.ButtonCount += 1
Dim btn As New Button
btn.ID = "Button_" & ButtonCount
btn.Text = btn.ID
AddHandler btn.Click, AddressOf ButtonClick
Me.ButtonPanel.Controls.Add(btn)
End Sub
例えば