質問

いくつかのフォームをモードレスにして、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の

これはあなたの役に立てば幸い...!

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top