2015年5月30日土曜日

[ASP.NET] 動的に追加したラベルやテキストボックスが消える現象の対策

How to keep the Panel controls in PostBack
ASP.NETでアプリ開発中に悩んだことがあったのでまとめてみました。

環境

・Windows8.1
・Visual Studio Community 2013
・C#


動的にラベルやテキストボックスを追加する

ASP.NETのPanelコントロールはラベルやテキストボックスを動的に追加することが出来ます。
本来はHTMLのデザインは静的に定義しておいた方がメンテナンスしやすいのですが、動的に追加したいことがあると思います。

次のソースはボタンをクリックするとPanelに現在時刻のラベルを追加するサンプルですが期待通りの動作ではありません。

index.aspx.cs


index.aspx


index.asp.designer.cs


実際に操作すると何度クリックしてもPanelには一つのラベルしか追加されません。
WindowsFormと違い、ASP.NETはボタンをクリックするとポストバックが処理され、Panelが初期化されてしうためです。
ソースは省略しますがUpdatePanelを使ったASP.NET Ajaxで作り替えてもWebアプリでも同様に一つのラベルしか追加されません。
ASP.NET Ajaxは画面遷移しませんがポストバックと同様のイベントが処理されるためです。


解決策

PanelにWebコントロールを追加する処理は、Page_LoadイベントでWebコントロールをすべて追加するようにしました。
クリックした時の時刻を文字列のリストに格納してリストの内容をPanelにすべて表示します。リストはSession変数に保存します。

修正したindex.aspx.cs



List<string>はシリアライズ可能なのでViewState変数に保存することも出来ます。

ViewState変数を使うように修正したindex.aspx.cs


MVCモデルでいうビューとコントローラーの分離が出来ないのが難点です。


関連ブログ

[ASP.NET] ポストバック処理で実行するJavaScriptを選ぶ方法
[ASP.NET] 動的に追加したイベントが動作しない
[C#] タスクトレイにバルーンチップを表示するアプリ
[Unity3D] Visual Studio Community 2013を日本語化してUnityアプリを作る
Unity3DのソースをVisual Studio Expressで編集する

以上、参考になれば幸いです。

0 件のコメント:

コメントを投稿

注: コメントを投稿できるのは、このブログのメンバーだけです。