投稿者 魔界の仮面弁士  (社会人) 投稿日時 2023/12/13 13:48:27
> なので、Form2 や ボタンの設定の問題ではないような気がします。
> 設定の問題ならどのキーでも終われないはずだと思えるのですが・・・・
モーダルダイアログにおいて、DialogResult プロパティは重要ですよ。

現状の実装は、本来使うべき Click イベントを使わずに
MouseUp や PreviewKeyDown だけで処理するという
かなり不自然な実装になっている点にも問題があります。
オーバーライドの不自然さも含めて、一度しっかりと見直された方が良いでしょう。
(不自然に見えるのは、説明のために処理を簡略化したせいでもあるようですが)


> ともかく[Tab]や[F12]で出来る事が
> 何故[Enter]で出来ないのか。不思議です。
ボタンにフォーカスがある状態で Enter や Space を押した場合、
標準動作としてクリックと同義になることはご存じかと思います。
しかし Tab や F12 はそうではありません。端的に言えばその差です。

Button1_PreviewKeyDown 冒頭の「MsgBox(e.KeyCode.ToString())」を削除して
Button1_Click にて「MsgBox(Me.DialogResult.ToString())」と記述してから
Space や Enter を押してみてください。 "None" と表示されますよね?

これは、モーダルフォームのボタンがクリックされた時点で、
 Me.DialogResult = Button1.DialogResult
に相当する処理が行われてから、Button1_Click が実行されるためです。

これが、先の回答で
>> Form2 のデザイン画面で、そのボタンの DialogResult プロパティは何になっていますか?
と確認した理由です。デザイン時の初期値は None だからです。


まず前提知識として、モーダルダイアログについて理解しておいていただきたいことが 3 点あります。

(1) ShowDialog が呼び出された時点で、そのフォームの DialogResult は None にリセットされる仕様です。

(2) その後、そのフォームの DialogResult が None 以外に設定された場合、
  次のアイドル時にそのフォームは(Close を呼んだり×を押したりせずとも)閉じられます。
  そして閉じられると、その時の Me.DialogResult が、ShowDialog メソッドの戻り値になる仕様です。

(3) そのダイアログは実際には非表示になっているだけであるため、ShowDialog 後は
 明示的に Dispose を呼び出す責任が生じます。これは、ダイアログが閉じられた後も、
 そのダイアログが利用され続ける可能性があるため、そういう設計になっています。
 (OpenFileDialog でも、ShowDialog 後に FileName プロパティを参照したりしますよね)

ここまではよろしいでしょうか?