به کد زیر توجه کنید:
<%@ Page Language="vb" %>
<HTML>
<body>
<form id="Form1" method="post" runat="server">
<script runat="server">
Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs)
Dim c As Integer
If Not IsNothing(viewstate("Dynamic_Button_Counts")) Then
For c = 0 To viewstate("Dynamic_Button_Counts") - 1
Dim nb As New Button
nb.ID = "btn_" & c & "_ID"
nb.Text = viewstate("btn_" & c & "_Text")
AddHandler nb.Click, AddressOf Button_Click
PlaceHolder.Controls.Add(nb)
Next
End If
End Sub


Private Sub Button_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)
Response.Write(CType(sender, Button).ID & " has been clicked. it's text is: " & CType(sender, Button).Text)
End Sub

Private Sub cmdAdd_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)
If IsNothing(viewstate("Dynamic_Button_Counts")) Then
ViewState.Add("Dynamic_Button_Counts", "0")
End If
ViewState.Add("btn_" & ViewState("Dynamic_Button_Counts") & "_Text", txtText.Text)
ViewState("Dynamic_Button_Counts") += 1

Dim c As Integer = ViewState("Dynamic_Button_Counts") - 1
Dim nb As New Button
nb.ID = "btn_" & c & "_ID"
nb.Text = viewstate("btn_" & c & "_Text")
PlaceHolder.Controls.Add(nb)
End Sub
</script>
<P><asp:textbox id="txtText" runat="server"></asp:textbox>
<asp:Button id="cmdAdd" runat="server" Text="Add New" OnClick="cmdAdd_Click"></asp:Button></P>
<P>
<asp:PlaceHolder id="PlaceHolder" runat="server"></asp:PlaceHolder></P>
</form>
</body>
</HTML>

و اما چند نکته:
1) کنترل ها رو توی page_load ایجاد می کنیم. چون هندلر اونها باید قبل از فراخوانی هندلر کنترل های صفحه به اون کنترل ها اضافه شده باشه.
2) آخرین کنترل که پس از کلیک روی cmdAdd باید ساخته بشه توی روال cmdAdd_Click ساخته میشه. دقت کنید که اضافه شدن هندلر به کلید جدید لازم نیست. در این request رویداد کلیک از cmdAdd فراخوانی شده و می دانیم حتما روی کلید جدید کلیک نشده. اما چون در form_load به کنترل ها اضافه نشده اگر در این روال اون رو به کنترل ها اضافه نکنیم باید یکبار صفحه post back بشه تا کنترل جدید نمایش داده بشه.
3) برای حفظ تعداد و text هر کلید جدید از viewstate کمک می گیریم