ShowDialogで表示したログイン画面、キャンセルを押された際にメッセージボックスで「本当にキャンセルする?」という質問を出し、「いいえ」なら抜けずにそのままログイン画面を表示し続ける、というロジックを書いたつもりだった。が、うまくいかない。
キャンセルする?に対してYesと答えたロジックには「Me.Close」が書かれているので、これでフォームが閉じるのは納得できる。が、Noと答えたロジックは、何もしない。なのに、勝手にフォームが閉じる。
原因は、どうやらフォームのCancelButtonプロパティにボタンを設定すると、CancelButtonプロパティを「無設定」にしても、キャンセルボタンに割り当てたボタンの、DialogResultプロパティが残ったままになってしまうことが原因のようだ。
以下は、最初の状態。Form2に貼ったButton1コントロールは、ただのボタン。
' 'Button1 ' Me.Button1.Location = New System.Drawing.Point(194, 220) Me.Button1.Name = "Button1" Me.Button1.Size = New System.Drawing.Size(82, 32) Me.Button1.TabIndex = 0 Me.Button1.Text = "Cancel" ' 'Form2 ' Me.AutoScaleBaseSize = New System.Drawing.Size(5, 12) Me.ClientSize = New System.Drawing.Size(292, 266) Me.Controls.Add(Me.Button2) Me.Controls.Add(Me.Button1) Me.Name = "Form2" Me.Text = "Form2" Me.ResumeLayout(False)
これに、CancelButtonをButton1にする設定を行うと、自動的にButton1のDialogResultプロパティに「キャンセル」が設定される。
' 'Button1 ' Me.Button1.DialogResult = System.Windows.Forms.DialogResult.Cancel Me.Button1.Location = New System.Drawing.Point(194, 220) Me.Button1.Name = "Button1" Me.Button1.Size = New System.Drawing.Size(82, 32) Me.Button1.TabIndex = 0 Me.Button1.Text = "Cancel" ' 'Form2 ' Me.AutoScaleBaseSize = New System.Drawing.Size(5, 12) Me.CancelButton = Me.Button1 Me.ClientSize = New System.Drawing.Size(292, 266) Me.Controls.Add(Me.Button2) Me.Controls.Add(Me.Button1) Me.Name = "Form2" Me.Text = "Form2" Me.ResumeLayout(False)
で、このあと、フォームの「CancelButton」プロパティを消してみよう。
' 'Button1 ' Me.Button1.DialogResult = System.Windows.Forms.DialogResult.Cancel Me.Button1.Location = New System.Drawing.Point(194, 220) Me.Button1.Name = "Button1" Me.Button1.Size = New System.Drawing.Size(82, 32) Me.Button1.TabIndex = 0 Me.Button1.Text = "Cancel" ' 'Form2 ' Me.AutoScaleBaseSize = New System.Drawing.Size(5, 12) Me.ClientSize = New System.Drawing.Size(292, 266) Me.Controls.Add(Me.Button2) Me.Controls.Add(Me.Button1) Me.Name = "Form2" Me.Text = "Form2" Me.ResumeLayout(False)
CancelButtonプロパティは消えたのに、Button1のDialogResultプロパティには値が残ったままになっている。ShowDialogで表示されたフォームは、このDialogResultプロパティに値が入っていると、ボタンに割り当てられたイベント処理(Clickイベントなど)の内容如何にかかわらず、強制的にフォームを閉じて親画面に処理を映し、親画面にはDialogResultの設定内容を伝えるようだ。
っていうかこれバグでは?