子フォームから子フォームへ操作したい
投稿者 bz9  (中学生)
投稿日時
2011/12/11 18:54:23
こんな感じでしょうか
Form1
Form2
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
Form2
急ぎでかいたのでもしかしたら動かないかもしれませんが、それも学習と思って修正してみては?
第29回 2つ目のフォーム
http://homepage1.nifty.com/rucio/main/dotnet/shokyu/standard29.htm
質問するときはどうやったらできたかというものも報告してくださいね。後々、同じことでわからなくなった方にも参考になりますので。
フォームにアクセスすることはあまりよくありません。
'×
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を閉じる,というのが個人的には綺麗だと思います。
この場合,考えることがほとんどないので楽なのですが……。
# 普通に,ボタンのハンドラでフィールドとして持っているであろう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
そしてForm2にあるボタンを押すと、Form3を消すという操作をしたいのですが、
調べても子フォームから親フォームへの操作方法くらいしかありませんでした。
どなたか教えて下さい。