- - PR -
[ASP.NET] WebUserControlに親のDataSetを渡したい。
投稿者 | 投稿内容 | ||||
---|---|---|---|---|---|
|
投稿日時: 2004-07-29 17:02
手詰まりとなってしまいまして、ご教授いただけますでしょうか。
あるASP.NETのページにWebUserControlを動的に複数個生成しているのですが。 その子のコントロールに親で生成したDataSetオブジェクトを渡そうと考えています。 現在、親のPage_LoadにてDataSetを生成し、下記のように処理しています。 For i=0 to x UserControl1(i) = New UserControl UserControl1(i).SetDataSet(DataSet1) Next ※SetDataSet関数では、DataSet1のポインタをUserControl1のメンバ変数に渡しているだけです。 しかし、このPage_Loadが終わると、親のメモリは開放されDataSet1のメモリも開放されてしまいます。 DataSetを丸ごと子の方に複製するしかないのでしょうか? (複製=値渡し?は、可能なのでしょうか?) よろしくお願いします。 | ||||
|
投稿日時: 2004-07-29 17:16
Page_Loadが終わるってことはクライアントにResponsが返されたってことですよね?
だとしたら、Sessionにでも保存しておかないとダメなのではないでしょうか。 | ||||
|
投稿日時: 2004-07-29 17:19
子コントロールも解放されるのだから、同じでは?
| ||||
|
投稿日時: 2004-07-29 17:26
>Page_Loadが終わるってことはクライアントにResponsが返されたってことですよね?
だとしたら、Sessionにでも保存しておかないとダメなのではないでしょうか。 DataSetは、値渡しが出来るのでしょうか? >子コントロールも解放されるのだから、同じでは? あれ?そういえば・・・ 親のPage_Load後に子のPage_Loadが走っているようなのですが。 親からもらったDataSetのポインタが消えてなくなっているのに、 親で作られた子自身が開放されてない? 違うか、処理順番の解釈が間違ってるのかな・・・ | ||||
|
投稿日時: 2004-07-29 18:14
値渡しはできないのでCopyメソッドなんかどうでしょう?
| ||||
|
投稿日時: 2004-07-29 18:20
よく整理しましょう。 ご参考 表にしてみました VS.NETが作る(というか、テンプレートファイル)Page.Loadイベントハンドラに「初期化するコード」と書いてあるのは、私は「コメントのバグ」だと思っています。ここで初期化してはいけません。初期化はPage.Initイベントハンドラで行います。 また、Loadイベントが終了しても、オブジェクトは無くなっていませんよ。オブジェクトが無くなるのは、レスポンスを返した後(の、ガベージコレクタが動作するとき)です。もっとも、メソッドのローカル変数は、メソッド終了で破棄されますが、そんなことしていませんよね。もっとも、参照されている限り、ガベージコレクタはメモリの解放を行いませんから、「メソッドの終了で破棄される」というのは、ちょっと違いますけど。 | ||||
|
投稿日時: 2004-07-29 19:19
子の関数内で
Public Sub SetDataSet(ByRef Dataset1 as DataSetType1) DataSet_Child = DataSet1 End Sub DataSet_Child : 子のページ内のグローバル変数 としていますが、何か扱い方がおかしいでしょうか? 親のPage_Load終了、子のPage_Load開始・・・ の時点で上記DataSet_ChildがNothingになってしまっています。 親Page_Load中に子にアクセスして見ましたが、その時点では、DataSetは生きているようです。 ちなみに親で持っているDataSetも親ページのグローバルです。 関数の流れ的には開放されないという判断であっていると思うのですが。 なんだか、子の方でNew→Page_Loadの間で一度オブジェクトを開放してたりしないでしょうか? 親がどうこうではなく、子が勝手にやってそうな・・・ | ||||
|
投稿日時: 2004-07-29 19:26
ややこしい流れ以前に、グローバル変数って具体的に何ですか? すご〜くあやしいしいんですが… なんでグローバル変数なんでしょう? あと、ByRefで渡してる理由はなんでしょう? |