2

私はFormClosingイベントを利用するC#ベースのユーティリティに取り組んでおり、フォームがform.Close()を介してプログラムで閉じられたかどうかによって、イベントは異なることを行うことになっています。メソッド、またはその他の方法(ユーザーがXをクリックする、プログラムを終了するなど)

FormClosingイベントのFormClosingEventArgsには、CloseReason(列挙型CloseReason)というプロパティがあります。

CloseReasonは、None、WindowShutDown、MdiFormClosing、UserClosing、TaskManagerClosing、FormOwnerClosing、ApplicationExitCallのいずれかになります。

理想的には、ユーザーが赤いXをクリックしたときとClose()をクリックしたときを区別する方法があります。メソッドが呼び出されます(他のアクションが実行された後、[続行]ボタンをクリックすることにより)。ただし、FormClosingEventArgsのCloseReasonプロパティはどちらの場合もUserClosingに設定されているため、ユーザーがフォームを意図的に閉じるときと、プログラムでフォームを閉じるときを区別する方法はありません。これは、Close()メソッドが任意に呼び出された場合にCloseReasonがNoneに等しくなるという私の予想に反します。

    //GuideSlideReturning is an cancelable event that gets fired whenever the current "slide"-form does something to finish, be it the user clicking the Continue button or the user clicking the red X to close the window. GuideSlideReturningEventArgs contains a Result field of type GuideSlideResult, that indicates what finalizing action was performed (e.g. continue, window-close)

    private void continueButton_Click(object sender, EventArgs e)
    { //handles click of Continue button
        GuideSlideReturningEventArgs eventArgs = new GuideSlideReturningEventArgs(GuideSlideResult.Continue);
        GuideSlideReturning(this, eventArgs);
        if (!eventArgs.Cancel)
            this.Close();
    }

    private void SingleFileSelectForm_FormClosing(object sender, FormClosingEventArgs e)
    { //handles FormClosing event
        if (e.CloseReason == CloseReason.None)
            return;
        GuideSlideReturningEventArgs eventArgs = new GuideSlideReturningEventArgs(GuideSlideResult.Cancel);
        GuideSlideReturning(this, eventArgs);
        e.Cancel = eventArgs.Cancel;
    }

これに関する問題は、Close(); イベントGuideSlideReturningがキャンセルされずに終了した後にメソッドが呼び出されると、FormClosingイベントハンドラーは、フォームがユーザーによって閉じられるのではなく、メソッドによって閉じられたことを認識できません。

理想的なのは、FormClosingイベントのFormClosingEventArgsCloseReasonが次のように定義できる場合です。

    this.Close(CloseReason.None);

これを行う方法はありますか?form.Close(); メソッドにはパラメーターを受け入れるオーバーロードがないので、設定できる変数または呼び出すことができる代替メソッドはありますか?

4

1 に答える 1

4

プログラムでcloseを呼び出す前にフラグを設定してください。これは、プライベートメソッドでまとめることができます。

private bool _programmaticClose;

// Call this instead of calling Close()
private void ShutDown()
{
    _programmaticClose = true;
    Close();
}  

protected override void OnFormClosing(FormClosingEventArgs e)
{
    base.OnFormClosing();
    _programmaticClose = false;
}
于 2012-08-18T03:14:19.320 に答える