ASP.NET2.0で動的コントロールで発生したイベントを受け取る方法

asp.netでは、動的に追加したコントロールのイベントを取得するためにはポストバック後のloadイベント時に動的にコントロールを追加してやる必要がある。
イベントが発生したコントロールの判定には、コントロールのIDプロパティが利用されているようなので、中身は別もののコントロールでもとにかく同じコントロールを追加してやれば、イベントを受け取れるようだ。



以下のようにすりゃいいんじゃないかと思う。

■動的コントロールの追加
Dim strUniqueKey As String = Now.ToString("mmssff") ' セッション内で一意な文字列
Dim objAddCmd As New Command
objAddCmd.ID = "cmdDynamic" & strUniqueKey
objAddCmd.Text = "動的なコマンドボタン"
AddHandler objAddCmd.ItemCommand, AddressOf cmdCommand_Click
Me.pnlDynamic.Controls.Add(objAddCmd)
lblHdnDynamicCtrls.Text &= "#" & objAddCmd.ID
lblHdnDynamicCtrls.Text &= "|" & "Click"
lblHdnDynamicCtrls.Text &= "|" & "Param"

■ポストバック後のLoadイベント
For Each strCtrlDataString As String In lblHdnDynamicCtrls.Text.Split("#"c)
If strCtrlDataString = "" Then Continue For

Dim strCtrlData() As String = strCtrlDataString.Split("|"c)
Dim objCmd As New Command
objCmd.ID = strCtrlData(0)
objCmd.CommandName = strCtrlData(1)
objCmd.CommandArgument = strCtrlData(2)
AddHandler objCmd.ItemCommand, AddressOf cmdCommand_Click
Me.pnlHidden.Controls.Add(objCmd) ' 非表示のパネルに追加
Next
lblHdnDynamicCtrls.Text = ""

イベントハンドラ
Private Sub cmdCommand_Click(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.CommandEventArgs)
'適当なコード
End Sub


実際に試した環境はasp.net+vb.net(visual studio 2005)。