Как отличить пользовательские изменения от программных в WinForms CheckBox? - PullRequest
1 голос
/ 11 мая 2010

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

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

Ответы [ 3 ]

0 голосов
/ 11 мая 2010

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

0 голосов
/ 16 ноября 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");
        }
0 голосов
/ 11 мая 2010

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

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

Стек вызовов выглядит так:

  • OnClick
  • set_Checked
  • OnCheckChanged

Таким образом, вам нужно вернуться назад 3, чтобы определить, кто установил Проверено

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

...