フォーム間でお互いのコントロールを操作しようと思い、以下の様にすると、
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' のハンドルされていない例外が 不明なモジュールです。 で発生しました。』
『現在の場所のソース コードを表示できません。』
と言われてしまいます。
そもそも、操作対象のフォームのインスタンスを作成してアクセスするのがいけないのでしょうか?又、どうしてこのような現象が起こるのでしょうか?
なんとか出来ました。具体的には、新規作成したフォーム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なのでしょうか?他に良い方法があったら御教授御願いします。
解決。
編集 削除も少し簡単な方法がありました。
①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
どうやってもいいんでしょうが、
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
こんなことが簡単かも。
Publicにしちゃうのが一番簡単かもしれませんね。
でも、当方6.0から.NETに移行中でありまして、オブジェクト指向の勉強中なのであります。よって、カプセル化ですか?なるべくPublicは使わないほうがいいのかなと(;´Д`)
日々修行です。レスどうもでした。