1

保存されていないデータがある場合にプログラマーがイベントを処理する場合、プログラムを終了するとき、プログラマーはFormClosing、操作を保存するか、保存しないか、またはキャンセルするかを尋ねる保存ダイアログを表示できます。

FormClosing イベントでヒットした場合、Cancel設定した操作をキャンセルしますe.Cancel = true;。これで問題ありません。ただし、メニューでユーザーがボタンを押すと、イベントではなくメニュー項目イベントを処理するため、実行するExit代わりに同じことが発生するe.Cancel = true;はずです。return;ClickFormClosing

現在、私はコードをほとんど複製しており、これを処理してエレガントでわかりやすい方法で複製を回避する方法があるかどうか疑問に思っていました。

private void FrmEditorFormClosing(object sender, FormClosingEventArgs e)
{
    if (NeedsToSave)
    {
        DialogResult saveChangesDialog = 
MessageBox.Show("There are unsaved changes. Save now?", 
"Xml Editor", MessageBoxButtons.YesNoCancel, MessageBoxIcon.Question);

        if (saveChangesDialog == DialogResult.Yes)
        {
            Save();
        }
        else if (saveChangesDialog == DialogResult.Cancel)
        {
            e.Cancel = true; // Only difference
        }
    }
}

private void ExitToolStripMenuItemClick(object sender, EventArgs e)
{
    if (NeedsToSave)
    {
        DialogResult saveChangesDialog = 
MessageBox.Show("There are unsaved changes. Save now?", 
"Xml Editor", MessageBoxButtons.YesNoCancel, MessageBoxIcon.Question);

        if (saveChangesDialog == DialogResult.Yes)
        {
            Save();
        }
        else if (saveChangesDialog == DialogResult.Cancel)
        {
            return; // Only difference
        }
    }

    Close();
}
4

4 に答える 4

3

これを行う必要はありません。メニュークリックハンドラーでCloseを呼び出すと、FormClosingイベントが発生し、そこでキャンセルできます。

于 2012-10-04T19:52:38.580 に答える
1

保存が行われたかどうかを示すブール値を返すメソッドに共通コードを配置します

private bool PromptSave()
{
    if (NeedsToSave)
    {
        DialogResult saveChangesDialog = 
            MessageBox.Show("There are unsaved changes. Save now?", "Xml Editor",
            MessageBoxButtons.YesNoCancel, MessageBoxIcon.Question);

        if (saveChangesDialog == DialogResult.Yes)
        {
            Save();
            return true;
        }
        else if (saveChangesDialog == DialogResult.Cancel)
        {
            return false;
        }
    }
    else
    {
        return false;
    }
}

その戻り値を使用してe.Cancelを設定します

于 2012-10-04T19:43:04.313 に答える
0

ブール値を返す別の関数に分割します。このようなもの:

bool ConfirmSave()
{
    if (NeedsToSave)
    {
        DialogResult saveChangesDialog = MessageBox.Show("There are unsaved changes. Save now?", "Xml Editor",
                                                            MessageBoxButtons.YesNoCancel, MessageBoxIcon.Question);

        if (saveChangesDialog == DialogResult.Yes)
        {
            Save();
            return true;
        }
        else if (saveChangesDialog == DialogResult.Cancel)
        {
            return false; 
        }
    }
}

この関数は、クローズイベントが発生した場所から呼び出すことができ、それに応じて結果を処理できます。

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

private void ExitToolStripMenuItemClick(object sender, EventArgs e)
{
    ConfirmSave();

    Close();
}
于 2012-10-04T19:43:24.977 に答える
0

これはかなり近いはずです

private void ExitToolStripMenuItemClick(object sender, EventArgs e)
{
  if (DoSaveOnExit())
    Save();
  else
    return;
}  

private void FrmEditorFormClosing(object sender, FormClosingEventArgs e)
{
   if (DoSaveOnExit())
    Save();
   else
    e.Cancel = true;             
}
private bool DoSaveOnExit()
{
  if (NeedsToSave)
  {
     DialogResult saveChangesDialog = MessageBox.Show("T", "Xml Editor",
     MessageBoxButtons.YesNoCancel, MessageBoxIcon.Question);

    if (saveChangesDialog == DialogResult.Yes)
    {
        return true;
    }
    else if (saveChangesDialog == DialogResult.Cancel)
    {
        return false;
    }

}
于 2012-10-04T19:53:07.283 に答える