كيف يقوم EventArgs بإلغاء العمل في حدث ForumClosing؟
-
11-09-2019 - |
سؤال
كيف يعمل 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
}
}