FormのFormClosingイベントが意図した動作をしてくれない

タグの編集
投稿者 winvis  (学生) 投稿日時 2009/11/7 11:23:24
テキストエディタ(MDI形式)を作っているのですが終了時に、テキストボックスに、変更があったときに保存するか否かそれともキャンセルか(はい、いいえ、キャンセルのボタンのついたダイアログ)を、聞くようにしたのですが、キャンセルを押しても、終了しません!いい絵でも、終了しません
と言うか、ダイアログがループしてしまいます!(消えて、すぐもう一個出てくる)
原因がわかりません・・・
誰か、助けてくださいorz

Private Sub Form3_FormClosing(ByVal sender As System.Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles MyBase.FormClosing

        If TextBox1.Modified = True Then
            If MessageBox.Show("変更されていますが保存しますか?", Form1.Name, _
       MessageBoxButtons.YesNoCancel, _
        MessageBoxIcon.Exclamation, _
    MessageBoxDefaultButton.Button2) = DialogResult.Yes Then
                Dim SaveFileDialog As New SaveFileDialog
                SaveFileDialog.InitialDirectory = My.Computer.FileSystem.SpecialDirectories.MyDocuments
                SaveFileDialog.Filter = "HTMLファイル(*.html)|*.html|テキスト ファイル (*.txt)|*.txt|すべてのファイル (*.*)|*.*"

                If (SaveFileDialog.ShowDialog(Me) = System.Windows.Forms.DialogResult.OK) Then
                    Dim FileName As String = SaveFileDialog.FileName
                    IO.File.WriteAllText(FileName, Me.TextBox1.Text, System.Text.Encoding.GetEncoding("UTF-8"))

                End If
                If DialogResult.Cancel Then
                    e.Cancel = True

                End If
            Else
                Me.Close()
            End If
        End If
    End Sub
投稿者 ヴァン  (社会人) 投稿日時 2009/11/7 14:42:03
Me.Close()

は必要ないのでは?
すでにClosedのイベントは走ってますから。
投稿者 cupid  (社会人) 投稿日時 2009/11/7 18:22:01
> ダイアログ)を、聞くようにしたのですが、キャンセルを押しても、終了しません
> e.Cancel = True  (a)

詳しく見てはいないけど、引用は矛盾していない。つまりForm3が閉じないは、(a)が原因でしょう。
投稿者 kmkm  (社会人) 投稿日時 2009/11/7 19:53:53
> キャンセルを押しても、終了しません!いい絵でも、終了しません

だって、closeをまたしているから、、、
このイベントがまた呼び出されてる、ってことです。
キャンセルといいえの場合分けも入ってませんよ。
(SaveDialogを出してからの保存とキャンセルの場合分けはあるけど。)

やりたいのはこういうことかなあ。
        If TextBox1.Modified = True Then
            Dim tmp As DialogResult = MessageBox.Show("変更されていますが保存しますか?"Me.Name, _
                                MessageBoxButtons.YesNoCancel, _
                                MessageBoxIcon.Exclamation, _
                                MessageBoxDefaultButton.Button2)
            If tmp = DialogResult.Yes Then
                Dim SaveFileDialog As New SaveFileDialog
                SaveFileDialog.InitialDirectory = My.Computer.FileSystem.SpecialDirectories.MyDocuments
                SaveFileDialog.Filter = "HTMLファイル(*.html)|*.html|テキスト ファイル (*.txt)|*.txt|すべてのファイル (*.*)|*.*"

                If (SaveFileDialog.ShowDialog(Me) = System.Windows.Forms.DialogResult.OK) Then
                    Dim FileName As String = SaveFileDialog.FileName
                    IO.File.WriteAllText(FileName, Me.TextBox1.Text, System.Text.Encoding.GetEncoding("UTF-8"))

                End If
                If DialogResult.Cancel Then
                    e.Cancel = True
                End If
            ElseIf tmp = Windows.Forms.DialogResult.Cancel Then
                e.Cancel = True
            End If
        End If