كيفية التمييز بين المستخدمين مقابل التغييرات البرنامجية في خانة الاختيار WinForms؟

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

سؤال

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

هل هناك طريقة بقعة لاكتشاف تغيير المستخدم مقابل التغيير البرنامجي الذي لا يعتمد على إعداد/التحقق من متغيرات المستخدم؟

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

المحلول

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

نصائح أخرى

جرب بعض التفكير القديم الجيد؟

StackFrame lastCall = new StackFrame(3);
if (lastCall.GetMethod().Name != "OnClick")
{
    // Programmatic Code
}
else
{
    // User Code
}

مكدس المكالمات يسير على هذا النحو:

  • عند النقر
  • set_checked
  • oncheckchanged

لذلك تحتاج إلى العودة 3 للتمييز من الذي تم تحديده

تذكر ، على الرغم من ذلك ، هناك بعض الأشياء التي يمكن أن تعبث مع مكدس المكالمات ، فهي لا يمكن الاعتماد عليها بنسبة 100 ٪ ، ولكن يمكنك تمديد هذا الأمر قليلاً للبحث عن المصدر الأصلي.

لقد جربت هذا وعمل.

        bool user_action = false;
        StackTrace stackTrace = new StackTrace();
        StackFrame[] stackFrames = stackTrace.GetFrames();
        foreach (StackFrame stackFrame in stackFrames)
        {
            if(stackFrame.GetMethod().Name == "WmMouseDown")
            {
                user_action = true;
                break;
            }
        }

        if (user_action)
        {
            MessageBox.Show("User");
        }
        else
        {
            MessageBox.Show("Code");
        }
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top