5

私は文書編集者に要約するものを書いています。アプリケーションを閉じるときに、変更を保存するようにユーザーに促す必要があります。これは簡単です。私の質問は、ユーザーにプロンプ​​トを表示せず、保存されていないデータを単に破棄して閉じるのが適切な場合です。

FormClosing イベントでは、CloseReason 列挙型に次が含まれます。

  • なし
  • Windowsシャットダウン
  • MdiFormClosing
  • ユーザー閉鎖
  • TaskManager閉じる
  • FormOwnerClosing
  • ApplicationExitCall

WindowsShutDown と TaskManagerClosing で「変更を保存しますか?」プロンプトが表示されたままアプリがハングしないようにします。

これは標準的な慣行ですか、それともここで何か他のことをする必要がありますか?

わかりやすくするために、コードは次のとおりです。

protected override void OnFormClosing(FormClosingEventArgs e)
{
    base.OnFormClosing(e);

    if (!(e.CloseReason == CloseReason.WindowsShutDown || e.CloseReason == CloseReason.TaskManagerClosing)
            && this.ChangesPending())
    {
        switch (MessageBox.Show(this, "Save changes?", "Save Changes", MessageBoxButtons.YesNoCancel))
        {
            case DialogResult.Yes:
                this.Save();
                break;
            case DialogResult.No:
                // Do nothing
                break;
            case DialogResult.Cancel:
                e.Cancel = true;
                break;
        }
    }
}
4

5 に答える 5

3

TaskManagerClosingプロンプトが表示されない唯一の理由があると思います。個人的には、WindowsShutDown. どこかにドキュメントを保存していない状態で Windows をシャットダウンしている場合、それは忘れていたことを意味します。

于 2009-01-20T20:18:48.240 に答える
3

また、WindowsShutDown で [保存しますか] ダイアログを必ず表示します (たとえば、アプリケーションがしばらくの間バックグラウンドにあり、ユーザーがそれを忘れているか、サービス パックの後に [再起動] をクリックした可能性があります)。よく考えずにインストールしたなど)。

TaskManagerClosing に関しては、この場合はダイアログを表示しません。

于 2009-01-20T20:19:41.700 に答える
0

TaskManagerClosingプロンプトを使用して保存することもできると思います。アプリが正常に応答している場合は、タスクマネージャーを使用してアプリを閉じることは、他の方法でアプリを閉じることと同じです。ハングしている場合は、onCloseハンドラーが何をするかは関係ありません。そこに到達することはありません。

最後の保存以降にデータが変更されていない場合は、保存を求めるプロンプトを表示しないことがより重要であるという点で、@Jerryに同意します。私は通常、単純な「変更された」フラグを使用します。このフラグは、編集アクションで設定され、保存と読み込みでクリアされます。

于 2009-01-20T20:49:45.493 に答える
0

本当に、CloseReason は論点ですよね。あなたのフォームが消えていくという事実は、あなたが捕まえようとしているものです.

ここで、アプリケーションが「保存」イベントを既に処理しているかどうかを知る必要があります。その場合、フォームは消える可能性があります。ドキュメントを保存しました。ただし、そうでない場合は、ユーザーにプロンプ​​トを表示することができます。

データをすばやく検証できる場合 (つまり、ファイル内のデータと比較してドキュメントで文字列比較またはハッシュ比較を行う)、ユーザーがフォーム データを保存したかどうかがわかります。

それ以外の場合、多数のフィールドがあり、それぞれをチェックすることがリソースを大量に消費する場合は、フォームに「isDirty」フラグを設定してください。Save() メソッドで isDirty を false に設定し、他のすべてのフィールド変更が true に設定されるようにします。

次に、formClosing で必要なのは次のとおりです。

protected override void OnFormClosing(FormClosingEventArgs e)
{
    if (isDirty) 
    {
        DialogResult R = MessageBox.Show(this, "Save changes?", "Save Changes", 
                MessageBoxButtons.YesNoCancel);

        if (R == DialogResult.Yes)
        {
            this.Save();
        } else if (R == DialogResult.Cancel)
        {
            e.Cancel = true;
        }
    }
}

于 2009-01-20T20:23:03.923 に答える
0

個人的には、ユーザーが [閉じる] を選択したときにプログラムを閉じることを好みます。閉じるときに保存されていないドキュメントがある場合は、それらのファイルのバックアップ コピーを保持し、次にアプリケーションを開いたときに保存されていないドキュメントがあることをユーザーに通知することを好みます。

私がこれを行う理由はいくつかあります。1 つは、アプリケーションに閉じるように指示したときにアプリケーションを閉じるのが好きであり、2 番目は、ファイルの一時コピーを保持して、ユーザーが作業するときにすべての変更を更新して保護するためです。予期しないクラッシュやアプリケーションの終了に対して。

したがって、この手法を使用すると、アプリケーションが閉じられたことを心配する必要はありません。

于 2009-01-20T20:19:16.803 に答える