• ベストアンサー

フォーム間の値の渡し方

こんにちわ。 C#で以下のようなことを実現しようとしています。 フォームA ・コンボボックスを選択⇒SelectedIndex値を変数Pへ ・フォームBを開く フォームB ・変数Pを読み込み処理 1.ここで、フォームAでSelectedIndexの値は変数Pに入っているのですが、 その値をフォームBで呼び出す方法がわかりません。 以下のコードでは、「System.Windows.Forms.FormにPの定義がありません」となってしまいます。 2.変数Pはpublicで宣言しているのですが、 それだけで全てのフォームから呼び出せる変数となるわけではないのでしょうか? ちなみに以下のようなコードにしてあります。 *********フォームA********* public int P; private void btn1_click(object sender, System.EventArgs e) { P = comboBox.SelectedIndex; F_B f1 = new F_B(); f1.ShowDialog(); } *********フォームB********* private void F_B_Load(object sender, System.EventArgs e) { switch (Owner.P) { case 0: ・・・・ case 1: ・・・・ } } どなたかアドバイスをお願いいたします。

質問者が選んだベストアンサー

  • ベストアンサー
  • hpp
  • ベストアンサー率64% (22/34)
回答No.7

整理しましょ。ここで話題なってるのは、次の2通りです。 1.親子関係を利用して他フォームの値を取得する。(Ownerプロパティ) 2.親フォームの参照を子フォームに渡すことにより、他フォームの値を取得する。(これは私が書いているものです。私が違う方式を書いて混乱されたかもしれません。ごめんなさい) この他、インターフェースを利用しても実現できますが(一番汎用性が高いがコード量も一番多い)、おいおい勉強していきましょう。 とりあえず、以下のページがわかりやすいと思います。 キャストとは型を変換して、変換した型固有の操作を可能にするものです。う~ん、わかりやすく言うと、人間というオブジェクトがあった時(実は女性とします)、男性にキャストしようとすると失敗します。実は女性だからです。で、女性にキャストすると成功します。実は女性だからです。女性にキャストできたので、女性が持っている固有の特徴が利用できるようになります。女性.子供を生む みたいな。 続いてインスタンス。クラスを記述するとは設計図を描いているようなものです。例えば車のクラスを記述することは、車の設計図を書いているに他なりません。車の設計図を書いたからって、ドライブできませんよね。設計図から実際に車を作る必要があります。こうして実際に作った車がインスタンスです。 設計図(クラス)があれば車(インスタンス)はいくらでも作れます。 Car car1 = new Car(); Car car2 = new Car(); Car car3 = new Car(); . . . . . . オブジェクト指向でプログラミングするとは、設計図(クラス)を用意しておき、必要な時に実体化(インスタンス)させて働かすようなイメージです。

参考URL:
http://dobon.net/vb/dotnet/form/accessanotherformdata.html
kenton
質問者

お礼

お礼をせず、放置してしまい申し訳ありません。 プログラムから離れなければならず、 しばらくの間、何も試すことができませんでした。 結局、プロパティをset・getすることで、データを渡す方法により、解決いたしました。 参考URLもありがとうございました。 クラス、インスタンスを本で読み、図解されているようなことからは、なんとなく理解できた気になっていましたが、 実際にコードを書いてみようとすると、何も理解できていなかったという事実がわかりました。 ご指摘、ありがとうございました。

その他の回答 (6)

回答No.6

#3: >> switch ( ((フォームA)Owner).P ) { > この部分を実行させていただきましたところ、 > ビルドの部分で問題は起きませんでした。 > ところが、実行させてみると、値がnullのようで、例外エラーが出まして、 > 「オブジェクト参照がオブジェクト インスタンスに設定されていません。」とエラーになってしまいました。 A から B を開くとき、 F_B f1 = new F_B(); f1.ShowDialog(this); このthisを忘れていませんか?

kenton
質問者

お礼

お礼をせず、放置してしまい申し訳ありません。 プログラムから離れなければならず、 しばらくの間、何も試すことができませんでした。 結局、プロパティをset・getすることで、データを渡す方法により、解決いたしました。 ご指摘、ありがとうございました。

  • hpp
  • ベストアンサー率64% (22/34)
回答No.5

あっ、キャストが話題になってたんで、キャストのコード書きましたが、簡単にはこうでもいいですよ。 フォームA(F_A)で、 F_B f1 = new F_B(this); フォームB(F_B)では、 F_A fa; コンストラクタで public F_B(F_A f) { fa = f; } あとは、 switch (fa.P) { case 0: ・・・・ case 1: ・・・・

kenton
質問者

お礼

ありがとうございます。 こちらのコードを僕なりに実行してみました。 まず、フォームAの「new F_B(this);」の部分で、引数を指定できるメソッド'F_A'のオーバーロードはありません。と怒られました。 そこで、「this」は取りました。 次にフォームBにコードを記述しようと思い、 InitializeComponent();の下に「F_A fa;」を、 その下「}」の直下にコンストラクタ部分を記述し実行しますと、 「型または名前空間に'fa'が見つかりませんでした。・・・」・・・ と全ての'fa'に関してのエラーが3種類出ました。 faというのはフォーム型の変数なんですよね? それをコンストラクタで、F_Aだとわからせて・・・ その中の変数Pを使うというコードなのですよね。きっと。 うーーむ。何から解決して良いのかわけわからなくなってきました。

  • hpp
  • ベストアンサー率64% (22/34)
回答No.4

簡単に実現するなら、 F_B f1 = new F_B(this); フォームBでは、 Form f; コンストラクタで public F_B(Form f) { this.f = f; } あとは、 switch (((フォームA)f).P) { case 0: ・・・・ case 1: ・・・・ みたいな感じで。フォームBにフォームAの参照が渡らなければ、Pをどこから呼び出すのかわかりません。 例えば鈴木さんを呼び出すことは禁止されていない(public)とき、どこに鈴木さんがいるのかわからなければ(フォームAへの参照)呼び出せないのと同じです。 この場合、フォームBへはFormオブジェクトとしてフォームAが渡されています。フォームBではあくまでフォーム型の変数を受け取ったにすぎません。なんだかわかんないけどこれはフォームなんだというレベルです。だから実際に使えるようにするには、フォームAにキャストする必要があります。例えるならなんだかわかんないけど食べ物をもらった。これはよくみたらラーメンだった(キャスト)。じゃぁ、ゆでて食べよう(ラーメンのメソッドが使えるようになる)。 みたいな感じです。わかるかなぁ(^^;

kenton
質問者

お礼

hppさん、回答ありがとうございます。 先日も助けていただき、感謝です。 ふむふむ。 説明を読むと、まずフォーム型の変数というものがあって、それをキャストするとは、その変数を実際に使えるよう(これがインスタンス?)にするということでよろしいでしょうか? コードまで教えていただきましたが、それをどこに記述してよいものかよく理解しておりません。^^;

回答No.3

> キャストというのは、「型変換」のキャストですよね。 YES. > 僕が参考にしているテキストでは、そのような例もなく・・・ もう一冊、ちゃんとしたのをお買いなさい。 switch ( ((フォームA)Owner).P ) { ... }

kenton
質問者

お礼

再び回答ありがとうございます。 >もう一冊、ちゃんとしたのをお買いなさい。 はい。もうちょっと根本的なことから勉強しなおさないといけないと思っていますので、書籍も検討いたします。 プログラムは初めてなので、どうしても簡単な入門書から手を付け始めてしまいます。 epistemeさんのお勧めがありましたら、助言を頂けたら幸いです。 > switch ( ((フォームA)Owner).P ) { この部分を実行させていただきましたところ、 ビルドの部分で問題は起きませんでした。 ところが、実行させてみると、値がnullのようで、例外エラーが出まして、 「オブジェクト参照がオブジェクト インスタンスに設定されていません。」とエラーになってしまいました。 やはりどこか理解の仕方を間違っているのだと思います。 もうちょっと追跡してみます。

回答No.2

こんにちは。 Owner.P では、コンパイル時にPがわからないのでエラーですよ。 OwnerをAにするか、キャストするか、型を指定するか・・・、 ですね。 (^^ゞ

kenton
質問者

お礼

回答ありがとうございます。 Ownerと書くことで、親フォームという認識は間違いなのですね。 OwnerをAにするか、キャストするか、型を指定するか・・・ とは、具体的にどのようにやるのでしょうか? フォームAのクラス名をOwnerの変わりに記述するのでしょうか? 何度も申し訳ありませんが回答を頂ければ幸いです。

回答No.1

OwnerをフォームAでキャストすればいいように思えます。

kenton
質問者

お礼

早速の回答ありがとうございます。 恥ずかしながら、「フォームAでキャストをする」という意味がわかりませんでした。 キャストというのは、「型変換」のキャストですよね。 僕が参考にしているテキストでは、そのような例もなく・・・ コードを載せるのが恥ずかしいですが、 object Owner = Form(F_A); としてみましたが、 「'(ファイル名).F_A'はクラスを意味しますが、変数でなければなりません」 とエラーが出ました。 もう少し、この部分のヒントをいただけないでしょうか? よろしくお願いします。

関連するQ&A