• ベストアンサー

子フォームから親フォームのオブジェクトを参照したい。

こんばんわ。 いまVB.Net2005でプログラミングしている者です。 子フォームから親フォームのオブジェクトを参照したいのですが, うまくいきません。 親フォームにListBox1を置き, ここに入力された内容を 子フォームで下記のように参照しようとしました。 Dim 子フォーム As New 子フォーム Label1.Text = 親フォーム.ListBox1.SelectIndex としたのですが, 親フォームでListBox1に0以外のリストを選択したのに, 子側に来ると親フォーム.ListBox1.SelectIndexの値が 0になってしまい,親側での選択内容が反映されません。 どうすれば正しく参照できるでしょうか? 教えてください。よろしくお願いします。

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

  • ベストアンサー
  • don_go
  • ベストアンサー率31% (336/1059)
回答No.3

’親フォーム Public Class Form1   Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click     Dim NewForm As New Form2()     NewForm.ListName = "12345"  '親フォームの値を子フォームに渡す     NewForm.ShowDialog()     '子フォームを表示     MsgBox(NewForm.ListName)   '子フォームから値を受け取る   End Sub End Class '子フォーム Public Class Form2   Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click     Me.Close()   End Sub   Public Property ListName() As String     Get       Return TextBox1.Text     End Get     Set(ByVal value As String)       TextBox1.Text = value     End Set   End Property End Class

tatsurou
質問者

お礼

don_goさん 回答ありがとうございました。 わかりやすく教えて頂きましてありがとうございます。 教えて頂いた方法で実現できました(^_^)

その他の回答 (2)

  • unamana19
  • ベストアンサー率62% (56/89)
回答No.2

don_goさんも言われているとおり、親フォームから子フォームに 値を渡すのが良いかと思います。 具体的には、子フォームインスタンス作成時にコンストラクタ 引数に親フォームを指定できるようにするか、 子フォームに独自のプロパティを実装して、親フォームを参照 できるようにするとかです。

tatsurou
質問者

お礼

unamana19さん 回答ありがとうございました。 参考にさせて頂きます。

  • don_go
  • ベストアンサー率31% (336/1059)
回答No.1

子フォームから親フォームを参照するのではなく 親フォームの方から子フォームに値を渡す様に すべきです。 でないと子フォームが複数のフォームから呼ばれる 様な場合、参照する親フォームのみが異なる他は 全く同じ子フォームを作らざるを得なくなります。

tatsurou
質問者

お礼

don_goさん 回答ありがとうございました。 参考にさせて頂きます。

関連するQ&A

  • MDI親フォームで子フォーム開放を知る

    はじめまして。VB.NET2005でプログラミングをしている初心者です。 MDIフォームのAPを作成しています。 MDI親フォーム1つと子フォームが2つあるとします。 親フォームから子フォーム2つをShowします。 子フォーム1を閉じたときに、親フォーム内で子フォーム1が閉じられた事を知るすべは無いのでしょうか。 親フォーム内で起こるイベントでどの子フォームが閉じられたかを得たいと思っています。 どなたか分かる方いらっしゃいましたらご教授ください。 宜しくお願い致します。

  • 特定のフォームだけ別フォームからの参照がされません

    VB 2005,Framework2.0を使用しています。 現在、サブフォームからダイアログフォームを表示し、ダイアログフォーム内の入力値等をサブフォームに渡す処理を行っています。 サブフォームは複数作成しており、特定のサブフォームだけダイアログフォームの入力値がサブフォームに渡されず原因が分からなくて困っています。 コードは以下のような形で書いています。 'サブフォーム Public Class Form1 Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim f As New Dialog1 f.StartPosition = FormStartPosition.CenterParent f.ShowDialog() End Sub End Class 'ダイアログフォーム Public Class Dialog1 Private Sub OK_Button_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles OK_Button.Click Form1.Label1.Text = Textbox1.text Me.Close() End Sub End Class 2005では、別フォームからの参照はVB6と同じようにインスタンスを作成しなくても参照できる様になったと聞いていますので、上記のコードでも参照方法として問題はないと思うのですが、うまく動作しない原因が分かる方が居られましたら宜しくお願いします。

  • C# 親フォームと子フォーム

    今、C#のプログラミングを作成中です。 内容は、 親フォームのボタンをクリック 子フォームのコンストラクタでエラーチェック エラーがあれば、エラーメッセージを出し、子フォームを閉じる エラーがなければ、子フォームが開く というようにしたいと思っています。 今とまっているのは、エラーがあれば、エラーメッセージを出し、子フォームを閉じるという所です。 どういう風に、子フォームにプログラムしたらよろしいでしょうか? それとも、親フォームにてエラーチェックを行うしか方法はないのでしょうか? 誰か分かられる方がいらっしゃいましたら、教えてください。 お願いいたします。

  • デリゲートで子から親フォームのメソッド実行について

    お世話になります。 .NET C#で開発をしております初心者です。 下記の様なデリゲートで子フォームから親フォームのメソッドを実行 させようとしています。 すると、parent2.MeisaiSyutoku(); の部分で エラーが発生してしまいます。 (エラー内容:NullReferenceExceptionはハンドルされませんでした。        オブジェクト参照がオブジェクト インスタンスに設定されていません。) 同じ子フォームで(親フォームは違いますが)、もう1つデリゲートをやっているのですが それも何か悪かったりするでしょうか。 下記のデリゲートで、デリゲート(2)はちゃんと実行されますが、デリゲート(1)の方でエラー となってしまいます。 どなたかご親切な方、違う方法でも構いませんので、子フォームから 親フォームのメソッドを実行する方法を教えて下さいます様、 宜しくお願い致します。      記 デリゲート(1) 子フォーム側 parent2; //親フォームの参照 public void setOya2(案内書 parent) { this.parent2 = parent; //親フォームから参照を受け取って保持する } private void button2_Click(object sender, EventArgs e) { ~イベント処理~ parent2.MeisaiSyutoku(); //案内書.csのメソッド実行 } 親フォーム側 private void button4_Click(object sender, EventArgs e) { Global.openMOTO = 1; 台帳 n台帳 = new 台帳(); n台帳.setOya2(this); n台帳.Show(); } private delegate void ctlFromChild(); public void MeisaiSyutoku() { new Thread(new ThreadStart(delegate { Invoke((ctlFromChild)delegate { Get_MeisaiSyutoku(); }); })).Start(); } デリゲート(2) 子フォーム側 送り状作成 parent1; //親フォームの参照 public void setOya1(送り状作成 parent) { this.parent1 = parent; //親フォームから参照を受け取って保持する } private void fpSpread1_CellDoubleClick(object sender, CellClickEventArgs e) { ~イベント処理~ parent1.changeTextBox4(zOtodokeSaki);         } 親フォーム側 private void button1_Click(object sender, EventArgs e) { Global.openMOTO = 0; 台帳 n台帳 = new 台帳(); n台帳.setOya1(this); n台帳.Show(); } private delegate void ctlFromChild(); public void changeTextBox4(string str) { new Thread(new ThreadStart(delegate { Invoke((ctlFromChild)delegate { this.textBox4.Text = str; }); })).Start(); }

  • ActiveX EXEのオブジェクトに渡したオブジェクトが微妙

    またまた微妙な質問ですみません。 ------- ActiveX EXEプロジェクト Class Hoge Public Sub Moge(lst) Dim Cast As ListBox MsgBox TypeName(lst) 'ListBoxと表示される Set Cast = lst 'ここがエラー Cast.List(2) = "hogehoge" 'キャストはできないがVariant型のままのアクセスは可能 End Sub ------- 標準EXE Class Form1 (List1を配置) Dim X As New Hoge Private Sub Form_Load() X.Moge List1 End Sub ----- このように、アウトプロセスのオブジェクトにフォームのコントロールを渡しました。 引数の型をAs ListBoxにしたかったのですが、それだとまずそこで型が一致しないといわれます。 しようがないのでVariantで引数を宣言し、渡した後にキャストしようと思ったのですが、そこでも型が一致しないといわれます。 TypeName関数は "ListBox" を返すし、Variant型のままメンバにアクセスすることはできるのですが、ListBox型の変数に代入することだけできないのです。 別プロセスのオブジェクトには、オブジェクトの参照は渡せないのでしょうか?

  • C# 親フォームと子フォームのデータのついて

    こんにちは、 今開発して内容は親フォームからチェックしたリストを子フォームのdatagridviewに自動的に追加したり、 チェックを外したら、子フォームのdatagridviewから登録した項目を削除すること作成しています。 親フォームからチェックした項目(データ)を子フォームの関数に渡しているのですが、子フォームのdatagridviewの更新がしなくて、データも反映されていない状況です。 どうすれば良いでしょうか。ご存知でしたら、教えてください。 どうぞよろしくお願いします。

  • VB2010でMDI親フォームから子フォームを表示

    VB2010でソフトを作っております。 MDI親フォームから子フォームを表示させたいのですが…。 過去に少しだけVB6を使っていたことがありますが、クラスという概念に苦労しております インスタンスや初期化といったところをうまく扱えばとは思うのですが、よろしくご指導お願いいたします。 1.MDI親フォーム(Form1)のボタンを押し、子フォーム(Form2)を表示させる 2.子フォームが表示されていなかったら表示させる 3.子フォームが表示されていたら何もしない これだけの事ですがずいぶん悩んでおります。 全コードがこれです。 Public Class Form1 Private f2 As New Form2 Private Sub Form1(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load Me.IsMdiContainer = True End Sub Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim fChild As Form() = Me.MdiChildren For Each f As Form In fChild If f.Text = "Form2" Then Exit Sub End If Next f2 = New Form2 f2.MdiParent = Me f2.Show() f2.Activate() End Sub Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click If f2 Is Nothing OrElse f2.IsDisposed Then f2 = New Form2 f2.MdiParent = Me End If f2.Show() f2.Activate() End Sub End Class ボタン1でもボタン2でも、期待する動作はするのですが、 ボタン1ではアクティブになっているフォームの名前を力技で取得している気がして… ボタン2では子フォーム(Form2)をすでに表示している状態でもさらにShowをしているのが気に入らなくて… もっとスマートな方法がありましたら、ご指導お願いします。

  • 子フォームから開いたフォームと親子関係を結びたい(VB2003)

    子フォームから開いたフォームと親子関係を結びたい(VB2003) VB.NET2003についての質問です。 formMain のクラスに以下のコードを書いて実行させると、form1がformMainの子フォームとして開きます 下記は、「form1」を「formMain」の子フォームとして開くコードです。 (formMainクラス内のコードです)   ------------------------------   Dim f As New form1   Me.IsMdiContainer=True   f.MdiParent=Me   f.Show   ------------------------------ form1には、form2を開くボタンが用意されています。 質問内容は、このform2を、formMainの子フォームとして開くにはどうすればよいか、ということです。 ためしに、form1クラスに以下のコードを書いて実行させたところ、 「formMainは型であるため、式として利用することができない」というエラーメッセージが出てしまいました。   ------------------------------   Dim f As New form2   f.MdiParent = formMain   f.Show()   ------------------------------ 以上、よろしくお願い致します。

  • VB2008で親フォームから子フォームを開いたときの処理で

    VB2008で親フォームから子フォームを開いたときの処理で 質問させて頂きます。 親フォームから子フォームを開いて、 子フォーム画面ロード時に、TreeViewにノードを追加する処理を行おうとするのですが、 ノードの追加ができません。 親フォームから子フォームの呼び出しの部分 Using frmAct As New form2 frmAct.ShowDialog() end using 子フォームLoad処理 Private Sub F_Actresult_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load Call MP_hogeload() ←別のモジュールからサブルーチンを呼び出してノード処理を追加させる。 End Sub 外部サブルーチン Public Sub MP_hogeload() With form2 .trehoge.Nodes.Add("hoge") end with end sub 同じ子フォーム内に記述している場合は問題なく追加できています。 この開き方の場合、別のモジュールでノードを追加させる方法を探しています。 よろしくお願いいたします。

  • C# 親フォームで指定した値を子フォームで表示する

    表題の件がうまくできず、困っています。 やりたいことは 親フォームのリストボックスで選択した インデックス番号をshouDialog()で立ち上げた子フォーム側の textBoxに表示したいんですが、 何も表示されず困っています。 namespace test { public partial class Form1 : Form { //リスト変数 public string listChoise; [STAThreadAttribute] static void Main() { Application.Run(new Form1()); } public Form1() { InitializeComponent(); } private void listBox1_SelectedIndexChanged(object sender, EventArgs e) { listChoise = listBox1.SelectedIndex.ToString(); MessageBox.Show(listChoise);//←ここでは値がでます }     private void button1_Click(object sender, EventArgs e) { //子フォームを立ち上げる Form2 form = new Form2(); form.ShowDialog(); } } } ↓Form2クラス namespace test { public partial class Form2 : Form { public Form2() { InitializeComponent(); //リスト選択変数 Form1 list = new Form1(); textBox2.Text = list.listChoise; } } } この二つのクラスです。 とくにエラーはありません。 ちなみに >>>//リスト変数 >>>public string listChoise; の部分を public string listChose = "aaaaa"; としておくと、 子フォームのテキストボックスに"aaaaa"と表示されているようなんですが、 >>>listChoise = listBox1.SelectedIndex.ToString(); の値がちゃんと子フォームの方で受け取れていないようです。 結果はなにもひょうじされません。 子フォームの方で、 MessageBox.Show("listChoise");をしても 何も表示されません。 どんな原因が考えられますでしょうか。 よろしくお願いします。 環境:visualC# 2008 Express Edition

専門家に質問してみよう