1

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

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

4

3 回答 3

0

尝试一些好的旧反射?

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

调用堆栈是这样的:

  • 点击
  • set_Checked
  • OnCheckChanged

所以你需要回到 3 来区分谁 SET Checked

但请记住,有些东西可能会干扰调用堆栈,它不是 100% 可靠的,但您可以稍微扩展一下以搜索原始源。

于 2010-05-10T21:42:30.627 回答
0

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

于 2010-05-10T21:45:55.297 回答
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");
        }
于 2010-11-16T14:41:56.083 回答