misc.log

日常茶飯事とお仕事と

ShowDialogでフォームが勝手に...

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の設定内容を伝えるようだ。

っていうかこれバグでは?