- PR -

[ASP.NET] WebUserControlに親のDataSetを渡したい。

投稿者投稿内容
華月
常連さん
会議室デビュー日: 2004/05/19
投稿数: 41
お住まい・勤務地: みちのく
投稿日時: 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を丸ごと子の方に複製するしかないのでしょうか?
(複製=値渡し?は、可能なのでしょうか?)
よろしくお願いします。
burton999
ぬし
会議室デビュー日: 2003/10/06
投稿数: 898
お住まい・勤務地: 東京
投稿日時: 2004-07-29 17:16
Page_Loadが終わるってことはクライアントにResponsが返されたってことですよね?
だとしたら、Sessionにでも保存しておかないとダメなのではないでしょうか。
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2004-07-29 17:19
子コントロールも解放されるのだから、同じでは?
華月
常連さん
会議室デビュー日: 2004/05/19
投稿数: 41
お住まい・勤務地: みちのく
投稿日時: 2004-07-29 17:26
>Page_Loadが終わるってことはクライアントにResponsが返されたってことですよね?
だとしたら、Sessionにでも保存しておかないとダメなのではないでしょうか。
DataSetは、値渡しが出来るのでしょうか?

>子コントロールも解放されるのだから、同じでは?
あれ?そういえば・・・
親のPage_Load後に子のPage_Loadが走っているようなのですが。
親からもらったDataSetのポインタが消えてなくなっているのに、
親で作られた子自身が開放されてない?
違うか、処理順番の解釈が間違ってるのかな・・・
burton999
ぬし
会議室デビュー日: 2003/10/06
投稿数: 898
お住まい・勤務地: 東京
投稿日時: 2004-07-29 18:14
値渡しはできないのでCopyメソッドなんかどうでしょう?
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2004-07-29 18:20
引用:

華月さんの書き込み (2004-07-29 17:26) より:

>子コントロールも解放されるのだから、同じでは?
あれ?そういえば・・・
親のPage_Load後に子のPage_Loadが走っているようなのですが。
親からもらったDataSetのポインタが消えてなくなっているのに、
親で作られた子自身が開放されてない?
違うか、処理順番の解釈が間違ってるのかな・・・


 よく整理しましょう。
ご参考 表にしてみました

 VS.NETが作る(というか、テンプレートファイル)Page.Loadイベントハンドラに「初期化するコード」と書いてあるのは、私は「コメントのバグ」だと思っています。ここで初期化してはいけません。初期化はPage.Initイベントハンドラで行います。

 また、Loadイベントが終了しても、オブジェクトは無くなっていませんよ。オブジェクトが無くなるのは、レスポンスを返した後(の、ガベージコレクタが動作するとき)です。もっとも、メソッドのローカル変数は、メソッド終了で破棄されますが、そんなことしていませんよね。もっとも、参照されている限り、ガベージコレクタはメモリの解放を行いませんから、「メソッドの終了で破棄される」というのは、ちょっと違いますけど。
華月
常連さん
会議室デビュー日: 2004/05/19
投稿数: 41
お住まい・勤務地: みちのく
投稿日時: 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の間で一度オブジェクトを開放してたりしないでしょうか?
親がどうこうではなく、子が勝手にやってそうな・・・
なちゃ
ぬし
会議室デビュー日: 2003/06/11
投稿数: 872
投稿日時: 2004-07-29 19:26
引用:

華月さんの書き込み (2004-07-29 19:19) より:
DataSet_Child : 子のページ内のグローバル変数

ちなみに親で持っているDataSetも親ページのグローバルです。

なんだか、子の方でNew→Page_Loadの間で一度オブジェクトを開放してたりしないでしょうか?
親がどうこうではなく、子が勝手にやってそうな・・・


ややこしい流れ以前に、グローバル変数って具体的に何ですか?
すご〜くあやしいしいんですが…

なんでグローバル変数なんでしょう?
あと、ByRefで渡してる理由はなんでしょう?

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