System.Windows.Forms.Loadイベントは一度だけとは限らない

自分の経験とドキュメントを読んだ感覚で判断したことが実は単なる思い込みだったことはままあるが、今回もそんな一件。

WindowsFormにおいて、FormのLoadイベントの解説は日本語ドキュメントでは以下のように明記されている。

Form.Load イベント
フォームが初めて表示される直前に発生します。

これに基づきLoadイベントには一度しか実行されないことを期待した処理をコーディングするのだが、なんと以下のコードを実行するとLoadイベントはShowDialogメソッドを実行した回数、つまり3回発生するのである。むろん、Form1クラスのインスタンスの生成は一度しか行っていないのに、だ。

Form1 frm1 = Form1;
frm1.ShowDialog();
frm1.ShowDialog();
frm1.ShowDialog();

フォームが初めて表示される直前、初めて表示? 初めて?......
ここでMSDNに掲載されている同イベントの原文(英文)を見てみよう。

Form.Load Event.
Occurs before a form is displayed for the first time.

orz....

.NET WindowsFormを使って数年になるのだが、今の今まで気が付かなかった。恥かしい限りだ。

追記:

誤解を招くかもしれないので敢えて書くが、以下のようにShowメソッドを使う場合は何度実行してもLoadイベントは一回しか発生しない。(この一貫性の無さが上記の思い込みを生む元凶だ)

Form1 frm1 = Form1;
frm1.Show();
frm1.Hide();
frm1.Show();
frm1.Hide();
frm1.Show();