- - PR -
[ASP.NET] 調査後:WebUserControlのPage_Init等が二回走る。
1
投稿者 | 投稿内容 |
---|---|
|
投稿日時: 2004-08-06 15:16
前回はご意見いただきありがとうございました。
あれから調査しまして、下記のことが分かりました。 Global.TextというString型のバッファをデバッグに使用しています。 Public Class WUC1 Private Sub Page_Init Global.Text = Global.Text & " WUC_Init " End Sub Private Sub Page_Load Global.Text = Global.Text & " WUC_Load " End Sub End Class Public Class Form1 Private Sub Page_Load Global.Text = Global.Text & " Form1_Load " Global.Text = Global.Text & " Debug1 " Dim wuc11 as WUC Global.Text = Global.Text & " Debug2 " wuc11 = New WUC Global.Text = Global.Text & " Debug3 " Me.Controls.Add(wuc11) Global.Text = Global.Text & " Debug4 " End Sub のようなプログラムを作成した際、出力されるGlobal.Textが 「 Form1_Load Debug1 Debug2 Debug3 WUC_Init WUC_Init Debug4 WUC_Load WUC_Load」 と動いてしまいます。 いろいろ調査しましたが、原因がわかりませんでした。 ご教授願います。 上記プログラムと実際のプログラムの相違点を大まかにいくつか。 1.実際はTableCellのControls.Addにてオブジェクトを登録している。 2.WebUserControl内にて、Button、List等を作成描画している。 3.親Formで取得、作成したDataSetを子(WebUserControl)に渡している。 |
|
投稿日時: 2004-08-07 16:20
追加です。
WebUserControlのNewは、一度しか走っていないようですので、オブジェクトが2個作成されているわけではなさそうですが。 内部で2回走らされているのでしょうか・・・ |
|
投稿日時: 2004-08-09 11:51
こんにちは
あくまでも推測なのですが、Webユーザコントロールを動的にロードするには LoadControl メソッドを使用する必要があるのではないでしょうか? WebユーザコントロールもWebフォームと同様に、ascx(Webフォームならaspx)とコードビハインドのクラスを元にし、実行時にASP.NETランタイムにより実際に実行されるクラスが生成されるものなので、コードビハインドのクラスだけでインスタンスを生成しても意味をなさないと思います。 (ロジックだけでUIが全くなければ動くかもしれませんが、そんなのWebユーザコントロールにする必要がないでしょうし・・・) |
|
投稿日時: 2004-08-09 16:43
なるほど!
コードビハインドのクラスだけでインスタンスが生成されれば.. ascxでAutoEventWireup=falseとしても効かず、デフォルトのAutoEventWireup=trueが設定される。 AutoEventWireupにより自動的にPage_Loadが発生する。 自動生成されるコードの this.Load += new System.EventHandler(this.Page_Load); と合わせてPage_Loadが2回発生する。 |
|
投稿日時: 2004-08-09 18:41
こんにちは。
まさしくそのとおりでした。 LoadControlを使うのが普通だったのですね・・・ Page_Init,Page_Load共に一回ずつになりました。 今、その関数等を調べています。 todoさんのおっしゃっていることを理解できるよう調査中であります。 |
1