- PR -

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

投稿者投稿内容
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2004-07-29 20:41
引用:

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


 今、1年前に作ったソースを眺めようとして、ふと思い出したのですが、子にDataSetをセットするのを、親のどこで行っていますか?
 なんか、すでに記憶があやふやなのですが、先のMSのページを検索したのは、その辺で同じように渡したはずのものが渡ってなかったからなんですね。で、「なんや、初期化する為のコードを書けって書いてあるのに、ここに書いたらあかんやん」という結論になって、どうも恨みがそこに凝り固まっているようです。

 子をNewしたり、初期化する為のコードは、親のinitイベントハンドラに記述するようにしてください。おそらく、その辺を移動すれば解決すると思います。

#もしくは、親のloadイベントハンドラで設定したものは、
#このloadイベントハンドラでは渡っていない、だったかも。。。
華月
常連さん
会議室デビュー日: 2004/05/19
投稿数: 41
お住まい・勤務地: みちのく
投稿日時: 2004-07-30 09:04
ご返答ありがとうございます。
グローバル変数は、DataSetと、必要としているデータの列番号のIntegerのみです。
書いた通りDataSetに親の同DataSetのポインタを放り込んでいます。
グローバルといってもGlobal.asaxの方ではないですよ?
子フォームのオブジェクトのグローバルです。
メンバ変数って言った方がいいか。

ByRefで渡している理由はデータを参照するだけなので値渡しの必要が無かったから。
それ以前に値渡しの方法がわからなかったのですが・・・

子のDataSetへのポインタ渡しは、親のPage_Loadで行っています。
今からInitの方に書いてみます。
こういう時は、InitializeComponent()のあとにソース追加でいいんですよね?

しかしInitって「手をつけるな〜」ってコメントはいってるんですよね・・・
それってどうなんでしょ。
いじる必要、かなりあるような気がするのですが。
なちゃ
ぬし
会議室デビュー日: 2003/06/11
投稿数: 872
投稿日時: 2004-07-30 10:03
多分Jittaさんの書き込み等から、私の書いてる内容は今回の現象の原因とは関係ないのだと思われますが、気になって所だけ書いておきます。
引用:

華月さんの書き込み (2004-07-30 09:04) より:
グローバルといってもGlobal.asaxの方ではないですよ?
子フォームのオブジェクトのグローバルです。
メンバ変数って言った方がいいか。


メンバ変数ってSharedじゃないですよね?インスタンスのメンバだとして、
普通インスタンスのメンバ変数をグローバル変数とは言わないです。これは独自用語が分かりにくいというような話ではなくて、完全に違う意味にとってしまいます。私も勘違いしました。

--追記--
って書いたんですけど、ひょっとしてSharedなメンバ変数ですか?
さすがにコントロールやページのロードで値をいじくる変数がSharedとは思わないので上のように書いたんですが…

前に書いたグローバル云々てのは、グローバル変数をこういう使い方すると、いずれにしてもどっかで破綻する可能性大だからです。今回の現象の原因ではないとしても。
--
引用:

ByRefで渡している理由はデータを参照するだけなので値渡しの必要が無かったから。
それ以前に値渡しの方法がわからなかったのですが・・・


華月さんの中で思っている値渡し/参照渡しと、ByRefやByValの違いによる値渡し/参照渡しは別物です。
※値型の変数に関しては同じといえますが、今回はクラスなので違います。

通常ByVal(もしくはByRefを書かない)で値渡しと説明されていると思いますが、これは参照変数自体を値渡しするという意味で、クラスのオブジェクトそのものは参照渡しです。所謂オブジェクトは参照渡しとか、クラスは参照渡しとか言われるのはこちらの話です。

ByRefをつけると、オブジェクトをさす変数そのものを参照渡しすることになります。ByRefをつけないと値渡しになりますが、これはオブジェクトをさす変数がコピーで渡されるという意味で、指されるオブジェクト自体はコピーされません(つまり所謂参照私状態)。

オブジェクトそのものを値渡しすることはできませんので、どうしても値渡しと同じようにしたければ、コピーしてから渡す、もしくは渡されたオブジェクトをコピーしておくなどで対応する必要があります。

[ メッセージ編集済み 編集者: なちゃ 編集日時 2004-07-30 10:53 ]
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2004-07-30 10:50
 私は逆に、なちゃさんの指摘(参照渡し/値渡し)こそ原因だと思います。

 親のLoadイベントハンドラでブレークして、子のDataSetの値を監視しながらステップ実行したら、どうなります?
華月
常連さん
会議室デビュー日: 2004/05/19
投稿数: 41
お住まい・勤務地: みちのく
投稿日時: 2004-07-30 13:17
親のPage_Load中は、確かにポインタ保持したままであることを確認。
Page_Load終了後、ステップ?は、子のPage_Loadへ。
Nothing。
この間にいったい何が。
短いソースなので最悪打ち直しも考えていますが。
プログラマ的にそれはそれで問題ありか・・・

メンバ変数は、普通のPublicです。

>これはオブジェクトをさす変数がコピーで渡されるという意味で、
>指されるオブジェクト自体はコピーされません
オブジェクトをさす変数ってポインタじゃないんですか?
えっとつまり、ByValでもByRefでもDataSetの値を変えたら親も変わってしまう?

>(つまり所謂参照私状態)。
ごめんなさい。読めません。

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