如何在WinForms CheckBox中区分用户与程序的变化?

时间:2010-05-10 21:33:07

标签: winforms checkbox oncheckedchanged

我在CheckBox的OnCheckedChanged事件上有逻辑,该事件在表单加载以及用户更改检查状态时触发。我希望逻辑只在用户操作时执行。

是否有一种灵活的方法来检测用户与程序化更改,而不依赖于设置/检查用户变量?

3 个答案:

答案 0 :(得分:0)

尝试一些旧的反思?

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

调用堆栈如下所示:

  • 的OnClick
  • set_Checked
  • OnCheckChanged

因此,您需要返回3以区分SET Checked

请记住,有一些东西可以搞乱调用堆栈,它不是100%可靠,但你可以扩展一点来搜索原始源。

答案 1 :(得分:0)

我通常在我的表单上有一个bool标志,我在编程更改值之前设置为true。然后事件处理程序可以检查该标志以查看它是用户还是程序化的。

答案 2 :(得分:0)

我试过这个并且有效。

        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");
        }