PlaceHolder や Panel にコントロールを動的に追加した時の挙動

ASP.NET の PlaceHolder や Panel にコントロールを動的に追加した場合、追加したコントロールの状態が保持されないようです。少しはまってしまったので、メモしておきます。確認手順は以下の通りです。

  1. 画面に PlaceHolder を配置
  2. Page_Init() や Page_Load() で !IsPostBack のときだけ、配置した PlaceHolder にコントロールを追加
  3. 実行して画面内のボタンなどをクリックしポストバックを発生させる
  4. PlaceHolder に追加したコントロールが表示されなくなる

回避するには、 PlaceHolder にコントロールを毎回 (IsPostBack の時も) 追加します。追加したコントロールにイベントも設定していると処理が少し複雑になってしまいます。その場合、カスタムコントロールやユーザコントロールなどに処理をまとめると多少はすっきりします。