子フォームから子フォームへ操作したい

タグの編集
投稿者 VB中学生  (学生) 投稿日時 2011/12/11 17:05:24
Form1という親フォームがあって、Form2、Form3という子フォームがあるとします。
そしてForm2にあるボタンを押すと、Form3を消すという操作をしたいのですが、
調べても子フォームから親フォームへの操作方法くらいしかありませんでした。

どなたか教えて下さい。
投稿者 bz9  (中学生) 投稿日時 2011/12/11 18:54:23
こんな感じでしょうか

Form1
Public Class Form1
    Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
        Form2.Show()
        Form3.Show()
    End Sub
End Class

Form2
Public Class Form2
    Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) _
        Handles Button1.Click

        Form3.Close()
    End Sub
End Class

投稿者 ラオシス  (中学生) 投稿日時 2011/12/11 20:29:06
すでに答えは出ていますが、普通はForm1.Show()などとインスタンスを作成せずに
フォームにアクセスすることはあまりよくありません。
'× 
Form1.ShowDialog()

'○ 
Dim InstForm1 As New Form1
InstForm1.ShowDialog()


Form1
Public Class Form1
     Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
         Dim InstForm2 As New Form2
         Dim InstForm3 As New Form3
        'ここでForm3がForm2でも操作できるようインスタンスを渡します 
         InstForm2.Show(InstForm3)
         InstForm3.Show()
     End Sub
End Class

Form2
Public Class Form2
     'Form1にあるInstForm3のコピーを格納する 
     Private InstForm3 As Form3
     
     Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) _
         Handles Button1.Click

         Me.InstForm3.Close()
     End Sub

     'Form2から操作できるようForm3のインスタンスが渡されます。 
     Public Overloads Sub Show(ByVal Form3 As Form3)
          Me.InstForm3 = Form3
          '自分(Form2)を表示します 
          Me.Show()
    End Sub
End Class

急ぎでかいたのでもしかしたら動かないかもしれませんが、それも学習と思って修正してみては?

第29回 2つ目のフォーム
http://homepage1.nifty.com/rucio/main/dotnet/shokyu/standard29.htm

質問するときはどうやったらできたかというものも報告してくださいね。後々、同じことでわからなくなった方にも参考になりますので。
投稿者 YuO  (社会人) 投稿日時 2011/12/11 23:56:12
Form3はForm2の子Formという扱いの方がよい,ということはないですか。
この場合,考えることがほとんどないので楽なのですが……。
# 普通に,ボタンのハンドラでフィールドとして持っているであろうForm3を閉じればよいので。

Form3もForm1の子Form扱いである必要があるのであれば,
個人的にはForm2がForm3を弄るのは不思議な感じがします。

このため,Form2にイベントを用意して,Form2のボタンを押すとそのイベントが発生し,
そのイベントをForm1でハンドルしてForm3を閉じる,というのが個人的には綺麗だと思います。

' Form2 
Public Event CloseButtonClick As EventHandler

Private Sub CloseButton_Click (sender As Object, e As EventArgs)
    Handles CloseButton.Click

    RaiseEvent CloseButtonClick(Me, EventArgs.Empty)
End Sub

' Form1 
Private WithEvents _form2 As Form2
Private WithEvents _form3 As Form3

Protected Overrides Sub OnLaod (e As EventArgs)
    MyBase.OnLoad(e)

    _form2 = New Form2()
    _form3 = New Form3()
    _form2.Show()
    _form3.Show()
End Sub

Private Sub Form2_CloseButtonClick (sender As Object, e As EventArgs)
    Handles _form2.CloseButtonClick

    If _form3 IsNot Nothing Then
        _form3.Close()
    End If
End Sub

Protected Overrides Sub OnFormClosed (e As FormClosedEventArgs)
    MyBase.OnFormClosed(e)

    If _form2 IsNot Nothing Then
        _form2.Close()
    End If
    If _form3 IsNot Nothing Then
        _form3.Close()
    End If
End Sub

Private Sub Form2_FormClosed (sender As Object, e As FormClosedEventArgs)
    Handles _form2.FormClosed

    _form2 = Nothing
End Sub

Private Sub Form3_FormClosed (sender As Object, e As FormClosedEventArgs)
    Handles _form3.FormClosed

    _form3 = Nothing
End Sub