投稿者 魔界の仮面弁士  (社会人) 投稿日時 2021/1/15 18:56:06
(方法2) CheckBox の値を Form3 に最初から渡しておく

ShowDialog を呼び出しているという事は、Form3 を呼び出している間、
Form2 はユーザー操作を受け付けません。ということは、Form3 を閉じるまで、
Form2 の CheckBox1 の状態は変化しないわけですよね。

そこで、Form3 を呼び出す際に、最初から CheckBox1 の値を渡しておくのはどうでしょう。
たとえば、下記のように受け渡せるよう、Form3 のコンストラクタに引数を追加するようにします。

Dim f3 As New Form3(CheckBox1.Checked)

Public Class Form3
    Private ChildFormChecked As Boolean = False
    Public Sub New(checked As Boolean)
        ChildFormChecked = checked
    End Sub
End Class


上記ではコンストラクタで渡していますが、
プロパティで渡したり、メソッドの引数として渡す方法もあります。



(方法3) イベントによるコールバックを用いる

まずは説明のため、フォント選択画面を開くための FontDialog というクラスを紹介させてください。

このクラスでは、ShowApply = True に設定しておくと、Apply イベントという物が使えるようになります。
https://docs.microsoft.com/ja-jp/dotnet/api/system.windows.forms.fontdialog.apply
Private Sub FontDialog1_Apply(sender As object, e As EventArgs) Handles FontDialog1.Apply
 TextBox1.Font = FontDialog1.Font
End Sub


この場合、ダイアログを閉じずとも、[適用]ボタンを押したタイミングで即座に、
呼び出し元の画面のフォント設定を変更することができることになります。

この方法だと、呼び出し元のフォームが、イベント応答によって、
自分自身のフォームを操作しているのだけなので、
> 子が親を直接参照する設計
を避ける事ができます。

案1 の手法とは異なり、親(Form)が子(Dialog)のプロパティ(Font)等を使って
親自身の画面を操作しているだけなので、画面間の依存性がありません。

これにより、どのフォームからでも呼び出し可能な、
再利用性の高い汎用的なダイアログ設計にすることができます。

イベントを通じてやり取りする方法は、下記の案4などでも紹介しています。
http://rucio.cloudapp.net/ThreadDetail.aspx?ThreadId=30578