أفضل طريقة للتعامل مع المستخدمين الذين ينقرون نقرًا مزدوجًا على الأزرار في تطبيق winforms؟

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

سؤال

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

أنا أتساءل، ما هي أفضل طريقة للتعامل مع هذا؟

لقد بدأت بتعطيل الزر في حدث النقر ولكن النقرة الثانية تأتي قبل أن تؤدي النقرة الأولى إلى تعطيل الزر.لم يتم التعرف على وضع العلامات الأخرى في الكود أيضًا.

أفكر في إضافة نوع من قفل المزامنة على الكود الذي يثير الحدث ولكني أتساءل عما إذا كان لدى أي منكم فكرة أفضل.

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

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

المحلول

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

في هذا الحدث، واستخدام العلم.

private bool runningExclusiveProcess = false;

public void onClickHandler(object sender, EventArgs e)
{
    if (!runningExclusiveProcess)
    {
        runningExclusiveProcess = true;
        myButton.Enabled = false;

        // Do super secret stuff here

        // If your task is synchronous, then undo your flag here:
        runningExclusiveProcess = false;
        myButton.Enabled = true;
    }
}

// Otherwise, if your task is asynchronous with a callback, then undo your flag here:
public void taskCompletedCallback()
{
    runningExclusiveProcess = false;
    myButton.Enabled = true;
}

إذا كنت لا تزال تحصل في اثنين من النقرات الخروج من شيء من هذا القبيل، ثم تأكد من أنك لم تشترك عن طريق الخطأ إلى حدث DoubleClick، أو أي شيء آخر متزعزع يجري.

نصائح أخرى

هل تتعامل مع الحدث مرتين؟

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

والعلم تعطيل على هذا الزر لن يتم تعيين حتى اكتمال معالج الأحداث الزر، وسوف تكون قائمة الانتظار أي نقرات إضافية في قائمة انتظار النوافذ رسالة راء النقرة الأولى. تأكد من أن معالج الحدث زر يكمل بسرعة لتحرير موضوع UI. هناك عدة طرق للقيام بذلك، ولكن كل تنطوي EATHER تفريخ موضوع أو الحفاظ على ترابط جاهزة وتنتظر AutoResetEvent.

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

وتعطيل زر بمجرد النقر فوقه. لذلك، لا يمكن معالجة الحدث مرتين. حالما تم التعامل مع الحدث، يمكنك إعادة تمكين الزر.

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

http://www.robault.com/category/Threading.aspx

وتعطيل زر بعد قيام المستخدم بالنقر فوق أولا، وقبل البدء في المهمة. عند اكتمال المهمة، وإعادة تمكين الزر.

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

ولقد بدأت عن طريق تعطيل زر   في الحدث انقر فوق لكن الثاني   انقر يأتي في قبل النقرة الأولى   تسبب الزر ليتم تعطيل.   وضع أعلام أخرى في القانون لم   قبض عليه أيضا.

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

هل لك أن تعطينا مثال يوضح مشكلتك؟

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