17

一部のフォームをモードレスにすることで、VB.NETアプリケーションをもう少し使いやすくすることに挑戦しています。

dlg.ShowDialog()を呼び出す代わりに、dlg.Show()とdlg.Hide()を使用する方法を理解したと思います。メインのアプリケーションフォームにモードレスダイアログのインスタンスがあります。

Public theModelessDialog As New dlgModeless

モードレスダイアログを起動するには、

theModelessDialog.Show()

dlgModelessそして、私が持っている[OK]ボタンと[キャンセル]ボタンハンドラー内

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」ボタンが私を捕まえています。そのボタンでフォームを閉じてから、フォームを再度開こうとすると、次のようになります。

ObjectDisposedExceptionは処理されませんでした。破棄されたオブジェクトにアクセスできません。

私はほとんどそこにいるように感じますが、次のいずれかを行う方法がわかりません。

  • その「X」ボタンを非表示にする
  • オブジェクトを破棄しないようにイベントをキャッチします(キャンセルを押したように扱います)

何か案は?

このダイアログのクラスはですSystem.Windows.Forms.Form

4

6 に答える 6

22

FormClosingイベントをキャッチし、理由がUserClosingである場合は、イベントのキャンセルをtrueに設定します。

次のようなもの:

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
于 2010-05-15T05:09:43.660 に答える
4

Me.Close()フォームを非表示にするために使用します。それを開くには、次のスニペットを使用します。

If theModelessDialog.IsDisposed Then
    theModelessDialog = New dlgModeless
End If
dlgModeless.Show()

これがデータを保存している場合は、データを保存する方法を理解する必要があります(おそらくフォームの静的変数に)。これは、あなたが達成しようとしていることを行うための適切な方法です。

私のVBがオフになっている場合も、私を許さなければなりません。しばらく経ちました。

于 2010-05-15T05:08:28.450 に答える
1

フォームを閉じるイベントを使用すると、フォームの管理された終了を実行できるため、終了を確認するための質問を含めました。また、フォームフラグを終了して、必要な場所でキャンセルを強制し、質問をしないようにします。あなたの提案も私を助けてくれてありがとう:)

    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
于 2012-04-06T08:53:16.667 に答える
1

@Johnは自分のコードでフォームを非表示にしており、上記の回答はその場合の解決策を提供します。ただし、多くの場合、フォームを再度使用する予定はないため、フォームを破棄する必要があります。Me.FormClosingすでに持っているanyCancel/Close / Exitコードに追加して、FormClosingイベントを処理すると、すべてのClose関連のアクティビティが1か所にまとめられます。たとえば、@ 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の微妙な違いについては、こちらをご覧ください。

于 2017-02-13T16:06:36.270 に答える
0

FormClosingイベントの処理に同意します。または、フォームのプロパティを変更して、システムXコントロールを非表示にします。

于 2010-05-15T05:28:27.903 に答える
0

私はすべてを試しましたが、メッセージボックスを表示せずに閉じたいだけでは機能しませんでした。必要なのは次のとおりです。

Private Sub FORM1_FormClosing(sender As Object、e As FormClosingEventArgs)はMe.FormClosingを処理します

 >e.Cancel = False
 >FORM2.Show()   (if you want to show another form)

サブ終了

これがお役に立てば幸いです...!

于 2016-12-09T15:36:42.333 に答える