2

私のプログラムには 2 つの方法で閉じる方法があります。1 つは右上隅の「X」で、もう 1 つは「終了」ボタンです。現在、特定の条件が満たされたときにこれらのいずれかが押されると、メッセージがまだ保存されていないことをユーザーに通知するポップアップが表示されます。彼らが保存した場合、メッセージはポップアップせず、プログラムは通常どおり終了します。これで、メッセージがポップアップ表示されると、ユーザーは [はい] ボタンと [いいえ] ボタンを含む MessageBox を取得します。「はい」を押すと、プログラムを保存する必要があります。「いいえ」が押された場合、プログラムは、ユーザーが「X」または「終了」ボタンを押したときに開始されたクローズ イベントをキャンセルする必要があります。

これを行う最善の方法は何ですか?

    private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
    TryClose();
}

private void TryClose()
{
    if (saved == false)
    {
        //You forgot to save
        //Turn back to program and cancel closing event
    }
}
4

7 に答える 7

4

FormClosingEventArgsプロパティが含まれていCancelます。e.Cancel = true;フォームが閉じないように設定するだけです。

private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
    if (!saved)
        e.Cancel = true;
}

コメントに応じて編集:

boolあなたの目標は同じ「保存方法」を使用できるようにすることなので、成功時に戻るように変更します。

private bool SaveData()
{
     // return true if data is saved...
}

次に、次のように記述できます。

private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
    // Cancel if we can't save
    e.Cancel = !this.SaveData();
}

また、ボタン ハンドラーなどはすべてSaveData()、必要に応じて呼び出すことができます。

于 2013-03-01T23:16:30.087 に答える
1

これはあなたが必要とすることをします:

private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
    e.Cancel = !TryClose();
}

private bool TryClose()
{
    return DialogResult.Yes == MessageBox.Show("Are you sure?", "Are you sure?", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
}
于 2013-03-01T23:17:38.617 に答える
0

終了ボタンから Close を呼び出すことができます。他の人が言ったように、 Forms.FormClosing イベントで終了を処理します。これにより、「X」からの終了ボタンのクリックとフォームの終了の両方が処理されます

于 2013-03-01T23:19:21.940 に答える
0

イベント引数のCancelプロパティを使用し、 true に設定してキャンセルします。

于 2013-03-01T23:17:08.817 に答える
0

終了イベントをキャンセルするには、インスタンスでCancelプロパティを設定するだけですtrueFormClosingEventArgs

if (!saved) {
  // Message box
  e.Cancel = true;
}
于 2013-03-01T23:17:15.417 に答える
0

OnFormClosing をオーバーライドします。

 protected override void OnFormClosing(FormClosingEventArgs e)
 {
    if (saved == true)
    {
       Environment.Exit(0);
    }
    else /* consider checking CloseReason: if (e.CloseReason != CloseReason.ApplicationExitCall) */
    {
       //You forgot to save
       e.Cancel = true;
    }
    base.OnFormClosing(e);
 }
于 2013-03-01T23:20:33.507 に答える
0
    private void Form1_FormClosing(object sender, FormClosingEventArgs e)
    {
        e.Cancel = !TryClose();
    }

    private bool TryClose()
    {
        if (!saved)
        {
            if (usersaidyes)
            {
                // save stuff
                return true;
            }
            else if (usersaidno)
            {
                // exit without saving
                return false;
            }
            else
            {
                // user cancelled closing
                return true;
            }
        }
        return true;
    }
于 2013-03-01T23:20:34.627 に答える