سؤال

كيف يعمل E.Cancel Event في حدث Formclosing على WinForm؟ أعلم أنك تحددها True لإلغاء الإغلاق، ولكن في أي نقطة تقوم بتعمل النموذج هذا؟ هل هناك إجراء ثانوي اتخذته العقار؟

كيف يمكنني تنفيذ إجراءات مماثلة في عنصر تحكم مخصص؟ (C # أو VB)

ملحوظة: لقد بحثت عن حوالي 30 دقيقة الآن ولم أتمكن من العثور على أي إجابات في Google أو البحث حتى إذا كانت مكررة، سيء.

هل كانت مفيدة؟

المحلول

أعتقد أن الملصق الأصلي قد يتساءل عما يحدث عند تعيين بعض المشتركين Cancel = false وبعض المشتركين مجموعة Cancel = true. وبعد إذا كان هذا هو الحال، فسيطر على السؤال "متى تقوم عملية النموذج" بهذه الأهمية.

في البداية، أتساءلت عما إذا كان الأمر قد تم تنفيذه إلى أو أو كل قيمة. استخدام العاكس لتفقد واضع CancelEventArgs.Cancel يظهر ذلك ببساطة يضع حقل خاص:

public bool Cancel
{
    get{ return this.cancel; }
    set{ this.cancel = value; }
}

لذلك أنا أحسب تطل في "النموذج". من شأنه أن يظهر (cluverventargs args) عند فحص القيمة، مثل الإجابات السابقة، ولكن هذا ليس ما يظهر عاكس:

[EditorBrowsable(EditorBrowsableState.Advanced)]
protected virtual void OnClosing(CancelEventArgs e)
{
    CancelEventHandler handler = (CancelEventHandler) base.Events[EVENT_CLOSING];
    if (handler != null)
    {
        handler(this, e);
    }
}

لذلك قمت بتمكين المصدر تصحيح الأخطاء ووجدت الحصول على EVENT_CLOSING مندوب من Events جمع يسقط في أعماق واجهة برمجة التطبيقات النافذة handler في السطر الأول من OnClosing يكون null عندما يحدد النموذج Cancel = true, ، وهذا يعني الشفرة المدارة لا تختبر أبدا ما إذا كان CancelEventArgs.Cancel == true. وبعد إذا كنت تريد الشجاعة القبيحة لما يحدث داخل قائمة EventHandler، فستحصل على هذا:

get { 
    ListEntry e = null;
    if (parent == null || parent.CanRaiseEventsInternal) 
    {
        e = Find(key);
    }
    if (e != null) { 
        return e.handler;
    } 
    else { 
        return null;
    } 
}

أثناء تصحيح الأخطاء، parent.CanRaiseEventsInternal هو خطأ إذا تم إلغاء الإغلاق.

لذلك ... التنفيذ الفعلي لإلغاء إغلاق النموذج أكثر تعقيدا من الإجابات السابقة، ولكن اقتراحاتهم لكيفية إلغاء الأحداث الخاصة بك تظهر بشكل صحيح كيفية القيام بذلك في التعليمات البرمجية المدارة. اتصل بالإلغاء في الداخل ثم اختبار قيمة CancelEventArgs.Cancel بعد أن أتيحت جميع المشتركين فرصة لتعيين القيمة true. وبعد لا يزال هذا لا يجيب على ما يحدث إذا كان بعض المشتركين مجموعة Cancel = false وبعض المجموعة Cancel = true. وبعد هل يعلم أحد؟ هل سيكون هناك حاجة شيء مثل ما يلي؟

public bool Cancel
{
   get{ return this.cancel; }
   set{ this.cancel = this.cancel || value; } 
}

نصائح أخرى

بعد نمط توليد الأحداث القياسية المستخدمة في نماذج Windows:

public event CancelEventHandler MyEvent;

protected void OnMyEvent(CancelEventArgs e) {
  CancelEventHandler handler = MyEvent;
  if (handler != null) {
    handler(this, e);
  }
}

private void button1_Click(object sender, EventArgs e) {
  CancelEventArgs args = new CancelEventArgs();
  OnMyEvent(args);
  if (!args.Cancel) {
    // Client code didn't cancel, do your stuff
    //...
  }
}
function OnMyCancelableEvent()
{
   var handler = CancelableEvent;
   var args = new CancelEventArgs()
   if(handler != null)
   {
        handler(this, args)
        if(args.Canceled)
           // do my cancel logic
        else
           // do stuff
   }
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top