投稿者 魔界の仮面弁士  (社会人) 投稿日時 2023/12/12 23:21:45
ShowDialog(IWin32Window) のオーバーロードをオーバーライドしている意図は何でしょうか?
IWin32Window を握りつぶしているうえに、MyBase.ShowDialog() ではなく Me.ShowDialog() を
呼び出しているのに、引数無しのオーバーロードはオーバーライドしていないので、目的が謎です。

それはさておき、Form1 側の実装ですが、他のフォームを ShowDialog で呼び出す場合は、
呼び出し側で、使用後に Dispose を呼ばなければなりません。(もしくは Using ブロックで囲むようにします)
Using f As New Form2()
    If f.ShowDialog(Me) = DialogResult.OK Then
        MsgBox("OK")
    Else
        MsgBox("Cancel")
    End If
End Using

ShowDialog で表示した時は、Close メソッドや ×ボタンで閉じても、実際には非表示になるだけでメモリに残るので、
使用後に Dispose しなければならない仕様です。

https://dobon.net/vb/bbs/log3-42/25503.html

https://learn.microsoft.com/ja-jp/dotnet/api/system.windows.forms.form.showdialog?view=netframework-4.0#:~:text=%E3%83%95%E3%82%A9%E3%83%BC%E3%83%A0%E3%81%AF%E9%96%89%E3%81%98%E3%82%8B%E3%81%AE%E3%81%A7%E3%81%AF%E3%81%AA%E3%81%8F%E9%9D%9E%E8%A1%A8%E7%A4%BA%E3%81%AB%E3%81%AA%E3%82%8B%E3%81%9F%E3%82%81

もしお Form1 側で Dispose を行うのが面倒なのであれば、Form2 側に Shared Function なメソッドを用意して、
その中で Form2 自身を New & Dispose すると良いでしょう。


さて本題。

>[エンターキー]では、2つあるのにどちらを押しても終われません。
Form2 のデザイン画面で、そのボタンの DialogResult プロパティは何になっていますか?
None のままであれば、OK や Cancel に設定して、再度試してみてください。

ダイアログとして利用されるフォームでは通常、そのフォーム上のボタンの DialogResult プロパティに
OK/Cancel/Yes/No といった値を設定しておくのが一般的です。(ついでに Form の AcceptButton/CancelButton も設定すると便利)
これだけで、Form2 側は何もコーディングせずとも、その Form2 が ShowDialog メソッドで呼ばれれば、
Form2 自身が Close されますし、ShowDialog メソッドの戻り値も自動設定されます。

もちろん、hori さんが行ったように、Me.DialogResult を直接書き換えるという手もあるのですが、
処理しているのは PreviewKeyDown という「事前処理」のイベントなので、折角設定してみたところで、
ボタンの DialogResult プロパティの値で上書きされてしまうわけです。