0

私のプログラム(form1)では、別のフォーム(form3)をForm3.ShowDialog(). このフォームは、進行状況バーによって追跡される比較的長いプロセスを実行します。このフォームには、このプロセス (pdf ドキュメントの生成) をキャンセルしてプロセスを元に戻すボタンがあります。

キャンセル ボタン (form3) のコードは次のとおりです。

Private Sub annulerBtn_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles annulerBtn.Click
        If (MsgBox("Êtes-vous sûr de vouloir annuler? Cette reviendra toutes les modifications apportées au document", MsgBoxStyle.YesNo, "annuler l'exportation") = MsgBoxResult.Yes) Then

            _cancel = True

            doc.Close()       'close pdf'
            fs.Close()        'close stream'

            If (_done And _backup) Or (Not _done And _backup) Then

                'revert file from backup if backup exists'
                System.IO.File.Delete(_path)
                IO.File.Copy("C:\temp\temp.pdf", _path)
                IO.File.Delete("C:\temp\temp.pdf")

            Else

                'otherwise simply delete the new file'
                System.IO.File.Delete(_path)

            End If

            Me.Close()
        Else
            'continue with the form!!'
        End If
    End Sub

このボタンでプロセスを終了し、バックアップを使用して変更を元に戻したいと思います。

私は現在、マルチスレッド化を避けておりApplication.DoEvents()、プロセス内でユーザー入力を引き続き使用しています。

ユーザーが [はい] ボタンを押すと、関数は期待どおりに機能します。ただし、ユーザーが [いいえ] を押した場合、プロセスは期待どおりに続行されますが、フォームはその後閉じられます。

デバッグは、それが呼び出されないこと、Me.Close()またはForm3.Close()ユーザーが no を押した後に表示されます。

この問題に関するヘルプをいただければ幸いです。ありがとうございます。

編集:これがコールスタックです

    App58.exe!App58.Form3.Form3_FormClosing(Object sender = {App58.Form3}, System.Windows.Forms.FormClosingEventArgs e = {System.Windows.Forms.FormClosingEventArgs}) Line 432  Basic
    System.Windows.Forms.dll!System.Windows.Forms.Form.OnFormClosing(System.Windows.Forms.FormClosingEventArgs e) + 0x77 bytes  
    System.Windows.Forms.dll!System.Windows.Forms.Form.CheckCloseDialog(bool closingOnly = false) + 0x8c bytes  
    System.Windows.Forms.dll!System.Windows.Forms.Application.ThreadContext.System.Windows.Forms.UnsafeNativeMethods.IMsoComponent.FContinueMessageLoop(int reason, int pvLoopData, System.Windows.Forms.NativeMethods.MSG[] msgPeeked) + 0x160 bytes   
    System.Windows.Forms.dll!System.Windows.Forms.Application.ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop(int dwComponentID, int reason = 4, int pvLoopData = 0) + 0x1ae bytes  
    System.Windows.Forms.dll!System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(int reason = 4, System.Windows.Forms.ApplicationContext context = {System.Windows.Forms.Application.ModalApplicationContext}) + 0x177 bytes 
    System.Windows.Forms.dll!System.Windows.Forms.Application.ThreadContext.RunMessageLoop(int reason, System.Windows.Forms.ApplicationContext context) + 0x61 bytes    
    System.Windows.Forms.dll!System.Windows.Forms.Application.RunDialog(System.Windows.Forms.Form form) + 0x33 bytes    
    System.Windows.Forms.dll!System.Windows.Forms.Form.ShowDialog(System.Windows.Forms.IWin32Window owner) + 0x370 bytes    
    System.Windows.Forms.dll!System.Windows.Forms.Form.ShowDialog() + 0x7 bytes 
    App58.exe!App58.Form1.RB_pdf_Click(Object sender = {Text = "Exporter PDF"}, System.EventArgs e = {System.Windows.Forms.MouseEventArgs}) Line 1994 + 0xa bytes   Basic
4

1 に答える 1

3

勝手な推測ですが、それが正しいかどうか教えてください。

DialogResultボタンのプロパティがannulerBtnとは異なるものに設定されていますNone。または、form3
のプロパティCancelButtonまたはがAcceptButtonannulerBtn

この条件のいずれかが true の場合、そのボタンをクリックすると、Closeメソッドを呼び出すかどうかに関係なく、フォームが自動的に閉じます。この一連のイベントを停止するには、クリック イベントを終了する前にform3.DialogResultプロパティをに設定する必要があります。DialogResult.None(または、上記のプロパティで設定されたフォームとボタンの間の関連付けを削除します)

于 2013-10-24T22:18:45.217 に答える