.NETでお互いのフォーム間のコントロールを操作するには?

解決


よしなり  2004-07-25 20:36:13  No: 84774  IP: [192.*.*.*]

フォーム間でお互いのコントロールを操作しようと思い、以下の様にすると、

Public Class Form1
    Inherits System.Windows.Forms.Form
    Private obj_From2 As Form2 = New Form2

End Class

Public Class Form2
    Inherits System.Windows.Forms.Form
    Private obj_From1 As Form1 = New Form1

End Class

『'System.StackOverflowException' のハンドルされていない例外が 不明なモジュールです。 で発生しました。』

『現在の場所のソース コードを表示できません。』

と言われてしまいます。

そもそも、操作対象のフォームのインスタンスを作成してアクセスするのがいけないのでしょうか?又、どうしてこのような現象が起こるのでしょうか?

編集 削除
よしなり  2004-07-26 13:26:21  No: 84775  IP: [192.*.*.*]

なんとか出来ました。具体的には、新規作成したフォーム2からフォーム1上のコントロールにアクセスしたかったのです。VB6に慣れてしまっていたのでエラく戸惑ってしまいました。

①Class Form1のメンバーに共有変数としてobj_Form1を追加。

Public Class Form1
    Inherits System.Windows.Forms.Form
    Public Shared obj_Form1 As Form1 = Nothing  ←★

②Class Form1のコンストラクタでobj_Form1にMeを格納。

    Public Sub New()
        MyBase.New()

        ' この呼び出しは Windows フォーム デザイナで必要です。
        InitializeComponent()

        ' InitializeComponent() 呼び出しの後に初期化を追加します。
        Form1.obj_Form1 = Me  ←★
    End Sub

③フォーム1でフォーム2を作成&表示。

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim obj_Form2 As Form2 = New Form2

        obj_Form2.Show()
    End Sub

End Class

④フォーム2から共有変数でアクセス。

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Form1.obj_Form1.Button1.Enabled = False
End Sub

新規作成したフォーム2からフォーム1上のコントロールにアクセスする場合、この方法がBESTなのでしょうか?他に良い方法があったら御教授御願いします。

編集 削除
よしなり  2004-07-27 13:54:13  No: 84776  IP: [192.*.*.*]

解決。

編集 削除
よしなり  2004-07-27 16:05:09  No: 84777  IP: [192.*.*.*]

も少し簡単な方法がありました。

①Class Form2のプライベートメンバーにobj_Form1を追加。

Public Class Form1
  Inherits System.Windows.Forms.Form
  Private obj_Form1 As Form1 = Nothing  ←★

②Class Form2のコンストラクタでフォーム1を取得。

Public Sub New(ByVal obj_Argument As Form1)
  MyBase.New()

        ' この呼び出しは Windows フォーム デザイナで必要です。
        InitializeComponent()

        ' InitializeComponent() 呼び出しの後に初期化を追加します。
        obj_Form1 = obj_Argument  ←★
End Sub

③フォーム1でフォーム2を作成&表示。

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim obj_Form2 As Form2 = New Form2(Me)

        obj_Form2.Show()
    End Sub

End Class

④フォーム2からアクセス。

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        obj_Form1.Button1.Enabled = False
End Sub

↓参考文献
ttp://dobon.net/vb/dotnet/form/accessanotherformdata.html

編集 削除
ねろ  2004-07-27 17:09:36  No: 84778  IP: [192.*.*.*]

どうやってもいいんでしょうが、

Public Class Form1
Inherits System.Windows.Forms.Form

Module Module1
      Public F1 As Form1         'F1をグローバルに宣言します。
End Module

Private Sub Form1_Load(ByVal sender As System.Object, _
  ByVal e As System.EventArgs) Handles MyBase.Load
      Dim F2 As New Form2
      F1 = Me                          'Form1のインスタンスをF1に設定
      F2.Show()
End Sub

#Form2側
Private Sub Button1_Click(ByVal sender As System.Object, _
      ByVal e As System.EventArgs) Handles Button1.Click
      F1.Button1.Enabled = False
End Sub

こんなことが簡単かも。

編集 削除
よしなり  2004-07-28 01:04:45  No: 84779  IP: [192.*.*.*]

Publicにしちゃうのが一番簡単かもしれませんね。
でも、当方6.0から.NETに移行中でありまして、オブジェクト指向の勉強中なのであります。よって、カプセル化ですか?なるべくPublicは使わないほうがいいのかなと(;´Д`)
日々修行です。レスどうもでした。

編集 削除