0

我有两个表格,表格 2 继承自表格 1。

我需要做的是,当我关闭表格 1 和表格 2 时,会出现另一个询问用户是否确定退出的表格。然后,如果用户单击“是”,当且仅当用户关闭的表单是表单 2 而不是表单 1 时,会出现另一个询问用户是否要保存游戏的表单,因为对于表单 1,不需要保存。

这就是我设法做到的:

// 这些是 Form 1 的关闭和关闭事件处理程序:

private void GameForm_FormClosing(object sender, FormClosingEventArgs e)
{
    e.Cancel = true;
    SureClose sc = new SureClose();
    sc.StartPosition = FormStartPosition.CenterScreen;
    sc.Show();
}

private void GameForm_FormClosed(object sender, FormClosedEventArgs e)
{
    MainMenu menu = new MainMenu();
    menu.Show();
}

然后在 Sure Close: // 请注意 Tournament 是 Form 2 继承自 GameForm (Form 1)

 private void yesButton_Click(object sender, EventArgs e)
 {
        this.Hide();

        if (GameForm.ActiveForm is Tournament)
        {
            SaveGame sg = new SaveGame();
            sg.StartPosition = FormStartPosition.CenterScreen;
            sg.Show();
        } 
        else 
        {
            GameForm.ActiveForm.Close();
        }
    }

    private void noButton_Click(object sender, EventArgs e)
    {
        this.Hide();
    }

// 这是保存游戏表单:

 private void saveButton_Click(object sender, EventArgs e)
 {
     // Still to do saving!
 }

 private void dontSaveButton_Click(object sender, EventArgs e)
 {
     this.Hide();
     GameForm.ActiveForm.Close();
 }

问题是当在 SureClose Form 中的 yesButton 事件处理程序中我有 GameForm.ActiveForm.Close() 时,这将返回到 GameForm Closing 事件处理程序,因此 SureClose 对话框再次出现。

我试过这样做: if (e.CloseReason() == CloseReason.UserClosing) 但显然它也不起作用,因为关闭的原因永远是用户:/

我该如何解决这个问题?非常感谢您的帮助!

4

1 回答 1

3

表格1:

private void GameForm_FormClosing(object sender, FormClosingEventArgs e)
{
    if(SureClose())
    {
        SaveChanges();
    }
    else
    {
        e.Cancel = true; 
    }
}

private bool SureClose()
{
    using(SureClose sc = new SureClose())
    {
        sc.StartPosition = FormStartPosition.CenterScreen;
        DialogResult result = sc.ShowDialog();
        if(result == DialogResult.OK)
        {
            return true;
        }
        else
        {
            return false;
        }
    }
}

protected virtual void SaveChanges()
{
}

表格2:

protected override void SaveChanges()
{
    using(SaveGame sg = new SaveGame())
    {
        sg.StartPosition = FormStartPosition.CenterScreen;
        DialogResult result = sg.ShowDialog();
        if(result == DialogResult.OK)
        {
            //saving code here
        }
    }
}

SureClose 表格和 SaveGame 表格:

private void yesButton_Click(object sender, EventArgs e)
{
    this.DialogResult = DialogResult.OK;
}

private void noButton_Click(object sender, EventArgs e)
{
    this.DialogResult = DialogResult.Cancel;
}
于 2012-12-07T12:55:53.093 回答