أفضل طريقة لتعليق أحداث التحكم في Windows Forms؟

StackOverflow https://stackoverflow.com/questions/287595

  •  08-07-2019
  •  | 
  •  

سؤال

يبدو أن هذه مشكلة بسيطة جدًا وشائعة جدًا.أبسط مثال يمكنني التفكير فيه هو:

يحتوي النموذج على خمس مربعات اختيار مع مربع اختيار "تحديد الكل/تحديد لا شيء" فوقها.عندما يحدد المستخدم تحديد جميع مربعات الاختيار، أقوم بتبديل حالات "الأطفال" - من الواضح أنني لا أريد إطلاق أحداث الاختيار لجميع الأطفال حتى أنتهي من تعيين جميع مربعات الاختيار.

لا يمكنني العثور على حدث التحكم في التعليق المرحلي على مستوى النموذج.إذا كنت أفتقدها ببساطة، فهذه إجابة بسيطة رائعة.باستثناء الحل البسيط الذي أفتقده، ما هي أفضل طريقة (أفضل الممارسات؟الحل المقبول؟) لتعليق أحداث التحكم في النموذج؟

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

المحلول

لقد صادفت هذا من قبل وعادة ما رأيت الناس يفعلون هذا:

/*SNIP*/

private bool isMassUpdate;

public void Check1_Check(object sender, EventArgs e)
{
   if(!isMassUpdate)
   {
       do some stuff
   }
}

/*SNIP*/

يمكنك أيضًا فصل معالجات الأحداث وإعادة توصيلها، ومع ذلك، قيل لي أن هذا يمكن أن يكون مصدرًا لتسرب الذاكرة.

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

نصائح أخرى

وماذا أفعل في هذه الحالات بدلا من وجود قيمة منطقية أن تعلق الأحداث، وأنا استخدم عداد. عندما يكون العد> 0، ثم تعليق الأحداث، عندما العد = 0، ثم تستأنف الأحداث. هذا يساعد على المشكلة إذا كان لدي العديد من الأشياء التي يمكن أن تطلب تعليق الأحداث.

والشيء الآخر المفيد هو إذا كنت بحاجة إلى تعليق الأحداث في كتلة، وإنشاء فئة المساعد الصغيرة التي هي IDisposable التي يمكن استخدامها في كتلة "باستخدام" (في C #) لذلك أنا لا تنسى أن إنقاص مكافحة مرة واحدة أنا خارج النطاق.

ومن السؤال الآخر الخاص بك، انا ذاهب الى تخمين كنت تستخدم VB .NET. لذا، RemoveHandler هو أفضل رهان. عادة في VB الناس يشيدون معالجات الأحداث باستخدام بند مقابض. ولكن يمكنك أيضا أن تفعل ذلك بهذه الطريقة:

AddHandler chk1.CheckedChanged, AddressOf DoSomething

وحيث تنفيذ DoSomething قد تبدو مثل هذا:

Private Sub DoSomething(ByVal sender As Object, ByVal e As EventArgs)
    ' whatever
End Sub

وAddHandler الأسلاك أعلى الحدث، لذلك سوف اطلاق النار. للحصول عليه لا لاطلاق النار، واستخدام RemoveHandler:

RemoveHandler chk1.CheckedChanged, AddressOf DoSomething

وقبل تحديث الخاصية قيد من مربعات طفلك، اتصل RemoveHandler على كل منهم. ثم عند الانتهاء من ذلك، ندعو AddHandler لوضع معالجات الأحداث إلى الوراء. وإذا كان كل خانات الخاص بك استخدام نفس معالج، يمكنك وضعها في مجموعة وحلقة من خلال جمع لإضافة أو إزالة معالجات.

ويمكنك أيضا أن تنظر في التعامل مع "فوق" الأحداث للأزرار، بدلا من تغييرها تحقق. قد يكون أقرب إلى القصد الخاص.

في بلدي الأساسية تطبيق Visual 6.0 اضطررت للتعامل مع المستخدمين النقر المزدوج < م> كل شيء ، لذلك على جميع معالجات الأحداث بلدي لدي سطر واحد يتحقق متغير عمومي

Private bSuspendEvents as Boolean

Private Sub Button1_Click()

    On Error Goto ErrorHandler

    If bSuspendEvents then Exit Sub

    bSuspendEvents = True

    'Do stuff

    NormalExit:
        bSuspendEvents = False
        Exit Sub

    ErrorHandler:
        'Handle Error
        Resume NormalExit

End Sub

وانظر السؤال تجاوز المكدس <م> كيف يمكنني تجاهل أحداث بسيطة اطلاق النار عند تغيير الدول المراقبة في أشكال C # ويندوز؟

<اقتباس فقرة>   

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

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