2

我的程序有两种关闭方式,一种是右上角的“X”,另一种是“退出”按钮。现在,当满足某个条件时按下其中任何一个时,会弹出一条消息,通知用户他们尚未保存。如果他们确实保存了,则不会弹出消息并且程序会正常关闭。现在,当消息弹出时,用户会得到一个带有 Yes 和 No 按钮的 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

覆盖 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 回答
0

使用事件 args的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

您可以从退出按钮调用 Close。然后像其他人所说的那样在 Forms.FormClosing 事件中处理关闭。这将处理退出按钮单击和从“X”关闭的表单

于 2013-03-01T23:19:21.940 回答