winform の右上にある「X」閉じるボタンの動作はどこで制御できますか?
-
27-09-2019 - |
質問
いくつかのフォームをモードレスにして、VB.NET アプリケーションをもう少し使いやすくしようと試みています。
dlg.ShowDialog() を呼び出す代わりに dlg.Show() と dlg.Hide() を使用する方法を理解できたと思います。メイン アプリケーション フォームにモードレス ダイアログのインスタンスがあります。
Public theModelessDialog As New dlgModeless
モードレスダイアログを起動するには
theModelessDialog.Show()
および [OK] および [キャンセル] ボタン ハンドラー内 dlgModeless
私は持っている
Private Sub OK_Button_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles OK_Button.Click
Me.DialogResult = System.Windows.Forms.DialogResult.OK
Me.Hide()
End Sub
Private Sub Cancel_Button_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Cancel_Button.Click
Me.DialogResult = System.Windows.Forms.DialogResult.Cancel
Me.Hide()
End Sub
それはうまくいくようです。
ただし、右上の「X」ボタンが気になります。そのボタンでフォームを閉じて、再度フォームを開こうとすると、
ObjectDissolvedException が処理されませんでした。破棄されたオブジェクトにアクセスできません。
ほぼ目標に向かって進んだように感じますが、次のいずれかを実行する方法がわかりません。
- 「X」ボタンを非表示にする
- イベントをキャッチしてオブジェクトを破棄しないようにします (キャンセルを押した場合と同じように扱います)
何か案は?
このダイアログのクラスは次のとおりです。 System.Windows.Forms.Form
.
解決
を使用するには、フォームを非表示にするMe.Close()
。
If theModelessDialog.IsDisposed Then
theModelessDialog = New dlgModeless
End If
dlgModeless.Show()
これは、データを保存している場合は、、あなたは(おそらく静的変数に/形でね)それを格納するいくつかの方法を理解する必要があります。これは、あなたがが達成しようとしているものを行うための適切な方法である。
また、私のVBがオフになっている場合は、私を許しする必要があります、それはしばらくしています。
他のヒント
理由はUserClosingある場合は、trueに設定したイベントにキャンセル、FormClosingイベントをキャッチします。
次のような何かます:
Private Sub Form1_FormClosing(sender as Object, e as FormClosingEventArgs) _
Handles Form1.FormClosing
if e.CloseReason = CloseReason.UserClosing then
e.Cancel = true
Me.Hide()
end if
End Sub
formclosingイベントは、私は、出口に確認するための質問が含まれているので、私は、フォームの管理終了を行うことができます。私はまた、私はそれをしたいので、質問をしていないところキャンセル強制するフォームフラグbterminateを持っています。おかげで、あなたの提案は、同様に私を助け:)
Dim msgboxresponse As MsgBoxResult
If e.CloseReason = CloseReason.UserClosing Then
If Not Me.bTerminate Then
msgboxresponse = MsgBox("Are you sure you want to cancel adding?", _
MsgBoxStyle.Question + MsgBoxStyle.YesNo, Me.Text)
If msgboxresponse <> MsgBoxResult.Yes Then
e.Cancel = True
Return
End If
End If
End If
@ジョン コード内でフォームを非表示にしており、上記の回答はその場合の解決策を提供します。ただし、多くの場合、そのフォームを再度使用する予定はないため、実際には する フォームを破棄したい。次を使用して FormClosing イベントを処理すると、Close 関連のアクティビティがすべて 1 か所にまとめられます。 Me.FormClosing
すでにあるCancel/Close/Exitコードにそれを追加します。例えば@John の場合:
Private Sub Cancel_Button_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) _
Handles Cancel_Button.Click, Me.FormClosing
....More code
Me.Dispose
End Sub
の使用に注意してください Me.Dispose
既存のものの代わりに Me.Close
. 。を離れる場合は、 Me.Close
無限ループが作成されてしまいます。見る Close と Dispose の微妙な違いについてはこれを参照してください。.
FormClosingイベントを処理するに同意します。またはシステムXコントロールを非表示にするために、フォームのプロパティを変更します。
私はすべてを試みたし、それは動作しませんでした あなただけの近くにしたい場合は、メッセージボックスを表示せずに、あなただけが必要になります。
プライベートサブFORM1_FormClosing(オブジェクト、FormClosingEventArgsとしてEと送信者)ハンドルMe.FormClosing
>e.Cancel = False
>FORM2.Show() (if you want to show another form)
End Subの
これはあなたの役に立てば幸い...!