0

私には2つのフォームがあり、フォーム2はフォーム1から継承しています。

フォーム1とフォーム2の両方を閉じると、ユーザーが必ず終了するかどうかを尋ねる別のフォームが表示されます。次に、ユーザーが[はい]をクリックすると、ユーザーがゲームを保存するかどうかを尋ねる別のフォームが表示されます。これは、ユーザーが閉じるフォームがフォーム1ではなくフォーム2である場合に限ります。これは、フォーム1では保存が必要ないためです。

これは私が何とかしたことです:

//これらはForm1の終了および終了イベントハンドラーです。

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で://トーナメントはGameForm(フォーム1)から継承したフォーム2であることに注意してください

 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();
    }

//これはSaveGameフォームです:

 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フォームのyesButtonイベントハンドラーにGameForm.ActiveForm.Close()がある場合、これがGameForm Closingイベントハンドラーに戻るため、SureCloseダイアログが再び表示されることです。

私はやってみました:if(e.CloseReason()== CloseReason.UserClosing)ですが、閉じる理由は常にユーザーであるため、明らかに機能しません:/

どうすればこれを解決できますか?助けてくれてありがとう!

4

1 に答える 1

3

Form1 :

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 に答える