- PR -

動的に追加したユーザーコントロールが消えてしまう

1
投稿者投稿内容
たけ
会議室デビュー日: 2004/12/13
投稿数: 6
投稿日時: 2005-01-19 23:01
C#でASP.NETの開発を行っています。
Page_load()から呼ばれるメソッド(仮にaaa()とします)の中で、
パネルに対して、動的にユーザーコントロールを追加しています。
画面起動時はユーザーコントロールが表示されるのですが、
例えばボタンクリックなどでイベントが走ると、
PostBackの場合は、そのaaa()を呼ばないようにしているため、
追加したユーザーコントロールが消えてしまいます。

PostBackの処理が走っても、追加したユーザーコントロールが消えないように、
ユーザーコントロールを保持することはできるのでしょうか。
------------------------------
private void Page_Load(object sender, System.EventArgs e){
 if(!Page.IsPostBack){
  aaa();
 }
}

private void aaa(){
 Control cl = Page.LoadControl("xxxxx.ascx");
 Panel1.Controls.Add(cl):
}
------------------------------
べる
ぬし
会議室デビュー日: 2003/09/20
投稿数: 1093
投稿日時: 2005-01-20 01:58
消えたのではなく追加されなかったのです。PostBackされた時は、新たにサーバー
コードが実行されるのですから。

で、普通にaspxファイルにタグ書くのはだめですか?
http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/vbcon/html/vbtskaddingusercontrolstowebformspage.asp

Page_Loadで追加している理由はわかりませんが、if(Page.IsPostBack)の時もaaa();
すれば一応追加されます。そもそも、ユーザーコントロールでない普通のコントロール
の場合は動的に追加しても「保持」することができたのでしょうか。
たけ
会議室デビュー日: 2004/12/13
投稿数: 6
投稿日時: 2005-01-20 09:30
べるさん、レスありがとうございます。
消えたのではなく、追加されなかったのですね。
別の方法を考えたいと思います。

> で、普通にaspxファイルにタグ書くのはだめですか?
今は、画面起動時に定義情報を読込んで、その情報を元に検索の入力項目を
動的に表示する、という検索画面を作成しています。
#その検索の入力項目(テキストボックス、ドロップダウンなど)を
#ユーザーコントロールで作成しています。

過去の場合、ポストバックに関係なく、aaa()を実行していたので、
問題なく表示されていました。
ですが、今は、画面起動時に動的に項目を表示するだけでなく、
画面内の切替ボタンでも、動的に項目を変更しようとしています。
そのときに、ViewState絡みとは思うのですが、
意図しない項目に値が表示されたりなど、挙動がおかしい部分があったので、
ユーザーコントロールを保持できたらいいのになと思っていたのでした。

それから、ボタンコントロールで試してみたところ、
動的に追加することはできましたが、保持することはできませんでした。
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2005-01-20 22:07
 ViewStateの読み込みは、Page.Loadイベントハンドラより前に行われます。フォーム上に表示するコントロールは、Page.Initイベントハンドラで追加しておくべきです。
# MSのサンプルは、そうなっています。

 Page_Loadメソッドにある「ページを初期化するユーザコード」の"初期"の状態は、Windowsアプリケーションで言うところの「イベントが発生する直前」の状態と解釈しましょう。Windowsアプリケーションではその状態を"維持"してくれていますが、Webアプリケーションでは、リクエストが発生するごとにその状態を"再現"してやらなければなりません。この再現された状態を作ることが、Page_Loadメソッドに書いてある「初期化する」の意味です。表示されるオブジェクトを作成する意味での初期化は、初期化イベントがあるのですから、そこで行うべきです。

_________________
べる
ぬし
会議室デビュー日: 2003/09/20
投稿数: 1093
投稿日時: 2005-01-20 22:07
引用:
今は、画面起動時に定義情報を読込んで、その情報を元に検索の入力項目を
動的に表示する、という検索画面を作成しています。
#その検索の入力項目(テキストボックス、ドロップダウンなど)を
#ユーザーコントロールで作成しています。

引用:
ですが、今は、画面起動時に動的に項目を表示するだけでなく、
画面内の切替ボタンでも、動的に項目を変更しようとしています。

ユーザーコントロールまわりがどういう実装かわからないですが、
引用:
意図しない項目に値が表示されたりなど、挙動がおかしい部分があったので、

ここを直すのが正攻法のように思います。

引用:
ViewState絡みとは思うのですが、

この根拠はわかりませんがViewStateはEnableViewStateで無効にできます。

#あら、ほぼ同時刻にJittaさんの詳しい説明が^^

[ メッセージ編集済み 編集者: べる 編集日時 2005-01-21 01:40 ]
1

スキルアップ/キャリアアップ(JOB@IT)