سؤال

أنا أكتب ما يتلخص في محرر الوثيقة.عند التطبيق يتم إغلاق أحتاج إلى مطالبة المستخدم على حفظ التغييرات.هذا من السهل بما فيه الكفاية.سؤالي هو متى يكون من المناسب لا مطالبة المستخدم, و بدلا من ذلك ببساطة تجاهل البيانات التي لم يتم حفظها وإغلاق.

في FormClosing الحدث ، CloseReason التعداد يشمل:

  • لا شيء
  • WindowsShutDown
  • MdiFormClosing
  • UserClosing
  • TaskManagerClosing
  • 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;
        }
    }
}
هل كانت مفيدة؟

المحلول

أعتقد TaskManagerClosing ينبغي أن يكون السبب الوحيد الذي لا يدفع ، إن وجدت.شخصيا, وأود أن يطلب في حالة WindowsShutDown.إذا أنا إيقاف تشغيل Windows مع غير المؤمنين الوثيقة في مكان ما ، فهذا يعني أنني قد نسيت حول هذا الموضوع.

نصائح أخرى

أود التأكيد أيضا تظهر "هل تريد حفظ" الحوار على WindowsShutDown (التطبيق قد مثلتم في الخلفية لبعض الوقت المستخدم نسيت عن ذلك ، أو أنه قد يكون النقر على "تشغيل" بعد حزمة الخدمة المثبتة دون التفكير مرتين.... الخ).

أما بالنسبة TaskManagerClosing كنت لا تظهر مربع الحوار في هذه الحالة.

أنا شخصيا أفضل أن مجرد إغلاق البرنامج عندما يقوم المستخدم بتحديد قريب, إذا كان هناك أي من المستندات التي لم يتم حفظها في وقت كنت تفضل الاحتفاظ بنسخ احتياطية من هذه الملفات إعلام المستخدم أن هناك المستندات التي لم يتم حفظها عندما تفتح التطبيق.

أنا أفعل هذا لعدة أسباب ، رقم واحد أحب إلى إغلاق تطبيقات عندما أقول لهم أن يغلق ، عدد اثنين من حفظ نسخة مؤقتة من الملف الذي يمكنني تحديث مع كل التغييرات باسم المستخدم يعمل على حماية ضد حوادث غير متوقعة ويغلق من التطبيقات.

حتى مع هذه التقنية لا تحتاج للقلق حول ow التطبيق مغلق.

حقا CloseReason هو نقطة خلافية ، أليس كذلك ؟ حقيقة أن النموذج الخاص بك هو ما تحاول التقاط.

الآن عليك أن تعرف إذا كان التطبيق الخاص بك بالفعل التعامل مع "حفظ" الحدث.إذا كان الأمر كذلك ، شكل يمكن أن تذهب بعيدا.لقد حفظ المستند الخاص بك.ولكن إذا كنت ترغب في مطالبة المستخدم.

إذا كان يمكنك التحقق من صحة البيانات بسرعة (أيهل سلسلة مقارنة أو التجزئة مقارنة على الوثيقة مقارنة البيانات في الملف) ثم عليك أن تعرف إذا كان المستخدم قد حفظ بيانات النموذج.

وإلا إذا كان هناك الكثير من المجالات ، والتحقق من كل واحد من الموارد باهظة ، ثم وضع "isDirty" العلم على النموذج الخاص بك.دعونا حفظ() طريقة تعيين isDirty إلى false ، وفي كل مجال تغيير مجموعات صحيح.

ثم في 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;
        }
    }
}

كنت أعتقد حتى TaskManagerClosing يمكن استخدام موجه إلى حفظ.إذا كان التطبيق الخاص بك هو الاستجابة بشكل طبيعي ، إغلاقه من خلال مدير المهام يجب أن لا يختلف عن أي وسيلة أخرى من إغلاقه.إذا كانت معلقة, لا يهم ما onClose معالج لا - لن نصل الى هناك.

أنا أتفق مع @جيري في أنه أكثر أهمية لتجنب دفع لإنقاذ إذا كانت البيانات لم تتغير منذ آخر حفظ.أنا عادة استخدام بسيط 'تغيير' العلم الذي يحصل على المجموعة أي تحرير العمل و مسح على يحفظ الأحمال.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top