Как отличить пользовательские и программные изменения в WinForms CheckBox?

У меня есть логика в событии CheckBox OnCheckedChanged, которое срабатывает при загрузке формы, а также когда пользователь изменяет состояние проверки. Я хочу, чтобы логика выполнялась только при действии пользователя.

Есть ли удобный способ обнаружения пользовательских и программных изменений, который не зависит от установки/проверки пользовательских переменных?


person cs31415    schedule 10.05.2010    source источник


Ответы (3)


Обычно у меня в форме есть логический флаг, который я устанавливаю в значение true перед программным изменением значений. Затем обработчик событий может проверить этот флаг, чтобы определить, является ли он пользовательским или программным.

person tster    schedule 10.05.2010
comment
cs31415 запросил решение, которое не включало установку «пользовательской переменной». - person Aren; 11.05.2010

Попробуйте какое-нибудь старое доброе отражение?

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

Стек вызовов выглядит следующим образом:

  • По щелчку
  • set_Checked
  • OnCheckChanged

Итак, вам нужно вернуться на 3, чтобы отличить, кто проверил SET.

Помните, однако, что есть некоторые вещи, которые могут испортить стек вызовов, они не на 100% надежны, но вы можете немного расширить это, чтобы найти исходный источник.

person Aren    schedule 10.05.2010

Я пробовал это, и это сработало.

        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");
        }
person ramyadel    schedule 16.11.2010