DOBON.NET DOBON.NETプログラミング掲示板過去ログ

動的コントロールへのイベント追加

環境/言語:[ASP.net windows2000]
分類:[ASP.NET]

いつもお世話になっております

@データを取得してテーブルを作成
ACELLにボタンを追加
Bボタンにイベントを追加

といった処理をしているのですが追加したイベントがおこりません。
POSTBACKはおこります。
ご存知の方がいらっしゃったらご教授願いますm(..)m

Private Sub S_CreateTableTree()
  ・
  ・
  Dim objbutton As New Button
  AddHandler objbutton.Click, AddressOf btn_Click
  objCell.Controls.Add(objbutton)
  tbltree.Rows(9).Cells.Add(objCell)
end sub

Private Sub btn_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)

End Sub
> 追加したイベントがおこりません。
>
> Private Sub S_CreateTableTree()
>   Dim objbutton As New Button
>   AddHandler objbutton.Click, AddressOf btn_Click
> end sub

ボタンのスコープがプロシージャ内ローカルなので
抜けるとインスタンスが無くなるからでは。
ご回答ありがとうございます
MSDNの
注 : Web フォームでコントロールを動的に作成する場合、コントロールを作成して、Page_Init イベント ハンドラまたは Page_Load イベント ハンドラで、作成したコントロールをコントロール コレクションに追加する必要があります。これを行わないと、コントロールが予期したように動作しない場合があります。

にあるとおりPage_Load内で追加する方法しかないということでしょうか?
プロシージャ内で追加することはできないのでしょうか?
#ASPは専門外なので細かい突っ込みはできません。。。

> 注 : Web フォームでコントロールを動的に作成する場合、コントロールを作成して、Page_Init イベント ハンドラまたは Page_Load イベント ハンドラで、作成したコントロールをコントロール コレクションに追加する必要があります。これを行わないと、コントロールが予期したように動作しない場合があります。

これは別の話になるのでは。
私が言ったのはobjButtonのスコープがローカルなのでSubを抜けるとインスタンスは破棄されるのではということです。
言い換えれば、貼り付けるフォームのプライベート変数にすればよいのではということです。
■No13934に返信(まどかさんの記事)
> 私が言ったのはobjButtonのスコープがローカルなのでSubを抜けるとインスタンスは破棄されるのではということです。

んー?
Controls.Add で追加されており、どこからも参照されなくなるわけではないので生きてると思ってたんですが。
まどかさん、名無しぃシャープさん、ありがとうございます

とりあえず
@Page_Loadであらかじめボタンのインスタンスを作っておく(visible=false)
ACELLに追加して表示するようにする(visible=true)

Dim M_button As New ArrayList
Dim m_btcnt As Integer

Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

  Dim i As Integer
  Dim form As Control = Page.FindControl("Form1")
  m_btcnt = 0
  For i = 1 To 99
   Dim button As New Button
   button.ID = "BT" & i
   button.Visible = False
   AddHandler button.Click, AddressOf Me.btn_Click
   form.Controls.Add(button)
   M_button.Add(button)
  Next
  ・
  ・
End Sub

Private Sub S_CreateTableTree()
  ・
  ・
  M_button(m_btcnt).Visible = True
  objCell.Controls.Add(M_button(m_btcnt))
  m_btcnt = m_btcnt + 1
  tbltree.Rows(9).Cells.Add(objCell)
end sub

Private Sub btn_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)

End Sub

これでイベントはおこるようになりました。
動的コントロールの場合は、POSTBACKされたら消えてしまう?ので
新たに作りなおさないといけないようです。(イベントの発生順のせい?)

処理的には解決したのですが、ボタンは可変なので予想最大数分作っておかなければならないところが気にかかります。

もう少しみなさまの意見を聞かせていただいてよい方法があるかどうか判断してから
解決済みとさせていただきたいと思います。
■No13938に返信(いっきゅうさんの記事)
> まどかさん、名無しぃシャープさん、ありがとうございます
>
> とりあえず
> @Page_Loadであらかじめボタンのインスタンスを作っておく(visible=false)
> ACELLに追加して表示するようにする(visible=true)
>
> Dim M_button As New ArrayList
> Dim m_btcnt As Integer
>
> Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
>
>   Dim i As Integer
>   Dim form As Control = Page.FindControl("Form1")
>   m_btcnt = 0
>   For i = 1 To 99
>    Dim button As New Button
>    button.ID = "BT" & i
>    button.Visible = False
>    AddHandler button.Click, AddressOf Me.btn_Click
>    form.Controls.Add(button)
>    M_button.Add(button)
>   Next
>   ・
>   ・
> End Sub
>
> Private Sub S_CreateTableTree()
>   ・
>   ・
>   M_button(m_btcnt).Visible = True
>   objCell.Controls.Add(M_button(m_btcnt))
>   m_btcnt = m_btcnt + 1
>   tbltree.Rows(9).Cells.Add(objCell)
> end sub
>
> Private Sub btn_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)
>
> End Sub
>
> これでイベントはおこるようになりました。
> 動的コントロールの場合は、POSTBACKされたら消えてしまう?ので
> 新たに作りなおさないといけないようです。(イベントの発生順のせい?)
>
> 処理的には解決したのですが、ボタンは可変なので予想最大数分作っておかなければならないところが気にかかります。
>
> もう少しみなさまの意見を聞かせていただいてよい方法があるかどうか判断してから
> 解決済みとさせていただきたいと思います。
>
>
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板