0

このコーディングを使用して、フォーム上のすべてのテキストボックス検証をバイパスする手段として、大きな赤い X のクリックを処理しています。

このコードは、フォーム上のデータ バインド コントロールに変更が加えられたかどうかをテストします。コードは、フォームを閉じる前に行われた変更をキャンセルします。

また、大きな X のクリックをキャンセルして、フォームを閉じないようにしたいと考えています。

フォームを実際に閉じることができない必要なコーディングを示すことができますか? 以下のコーディング ショーの Else ステートメントの後に、この新しいコーディングを追加したいと思います。

Protected Overrides Sub WndProc(ByRef m As System.Windows.Forms.Message)

    Select Case ((m.WParam.ToInt64() And &HFFFF) And &HFFF0)

        Case &HF060 ' The user chose to close the form.

            Me.StudentsBindingSource.EndEdit()
            Me.AutoValidate = System.Windows.Forms.AutoValidate.Disable

            If Me.StudentsDataSet.HasChanges Then

                ' Alert the user.
                '----------------
                If MessageBox.Show("You are about to loose any *** Student *** changes you have made! " & vbCrLf & vbCrLf & _
                                   "ARE YOU SURE YOU WANT TO DO THIS?" & vbCrLf & vbCrLf, _
                                   "*** W A R N I N G ***", _
                                   MessageBoxButtons.YesNo, _
                                   MessageBoxIcon.Warning, _
                                   MessageBoxDefaultButton.Button2) = Windows.Forms.DialogResult.Yes Then

                    RibbonButtonCancelChanges_Click(Nothing, Nothing)
                Else
                    ' Reset validation.
                    '------------------
                    Me.CausesValidation = True
                End If
            End If
    End Select

    MyBase.WndProc(m)
End Sub

これを試しましたが、テキスト ボックス コントロールの Validating イベントが実行されますが、これは私たちが望んでいるものではありません。

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

    Me.AutoValidate = System.Windows.Forms.AutoValidate.Disable
    Me.StudentsBindingSource.EndEdit()

    If Me.StudentsDataSet.HasChanges Then

        ' Alert the user.
        '----------------
        If MessageBox.Show("You are about to loose any *** Student *** changes you have made! " & vbCrLf & vbCrLf & _
                           "ARE YOU SURE YOU WANT TO DO THIS?" & vbCrLf & vbCrLf, _
                           "*** W A R N I N G ***", _
                           MessageBoxButtons.YesNo, _
                           MessageBoxIcon.Warning, _
                           MessageBoxDefaultButton.Button2) = Windows.Forms.DialogResult.Yes Then

            RibbonButtonCancelChanges_Click(Nothing, Nothing)
        Else
            ' Reset validation.
            '------------------
            Me.CausesValidation = True

            e.Cancel = True
        End If
    End If
End Sub
4

3 に答える 3

11

絶対に使ってはいけませんWndProc

代わりに、FormClosingイベントを処理しe.Cancelて true に設定します。

于 2012-07-15T20:20:05.140 に答える
2

SLaks が言ったように、WndPorc() で複雑になるのではなく、FormClosing() イベント プロシージャを使用する必要があります。WndProc() のオーバーライドは、これらのイベントを処理するイベント プロシージャの余裕がない C++ などの言語で使用されます。しかし、VB.NET の単純さにより、FormClosing() というイベント プロシージャが提供されます。コードを開き、オブジェクト ドロップダウン (左側) でフォーム名を選択し、イベント ドロップダウン (右側) から FormClosing を選択します。これにより、次のようなイベント コードを記述するためのテンプレートが得られます。

Private Sub FormClosing(Source as Object, e as EventArgs) Handles MyForm.Closing
    e.Cancel = True
End Sub

上記のように「e.Cancel = True」を追加するだけで、フォームが閉じなくなります!

于 2012-07-15T20:34:39.003 に答える
0

FormClosing と e.Cancel について教えてくれてありがとう

必要なものすべてを処理する FormClosing と WndProc の組み合わせを使用できました。

フォーム クラス名の直後にこれを追加しました。

Dim blneCancel As Boolean = False

私の WndProc は次のようになりました。blneCancel の設定に注意してください。

Protected Overrides Sub WndProc(ByRef m As System.Windows.Forms.Message)

    Select Case ((m.WParam.ToInt64() And &HFFFF) And &HFFF0)

        Case &HF060 ' The user chose to close the form.

            Me.StudentsBindingSource.EndEdit()
            Me.AutoValidate = System.Windows.Forms.AutoValidate.Disable

            If Me.StudentsDataSet.HasChanges Then

                ' Alert the user.
                '----------------
                If MessageBox.Show("You are about to loose any *** Student *** changes you have made! " & vbCrLf & vbCrLf & _
                                   "ARE YOU SURE YOU WANT TO DO THIS?" & vbCrLf & vbCrLf, _
                                   "*** W A R N I N G ***", _
                                   MessageBoxButtons.YesNo, _
                                   MessageBoxIcon.Warning, _
                                   MessageBoxDefaultButton.Button2) = Windows.Forms.DialogResult.Yes Then

                    RibbonButtonCancelChanges_Click(Nothing, Nothing)
                Else
                    ' Reset validation.
                    '------------------
                    Me.CausesValidation = True
                    blneCancel = True
                End If
            End If
    End Select

    MyBase.WndProc(m)
End Sub

FormClosing プロシージャは次のようになります。

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

    If blneCancel = True Then
        e.Cancel = True
    End If
End Sub

これで、ユーザーは電話番号のテキストボックスに何でも入力できますが、ユーザーが大きな X をクリックしてフォームを閉じるかどうかは検証されません。フォームは、何かが変更されたことをユーザーに警告するメッセージを表示し、戻って変更を保存するか、何も保存せずに終了するかを選択できるようにします。

于 2012-07-15T23:09:15.463 に答える