我在CheckBox的OnCheckedChanged事件上有逻辑,该事件在表单加载以及用户更改检查状态时触发。我希望逻辑只在用户操作时执行。
是否有一种灵活的方法来检测用户与程序化更改,而不依赖于设置/检查用户变量?
答案 0 :(得分:0)
尝试一些旧的反思?
StackFrame lastCall = new StackFrame(3);
if (lastCall.GetMethod().Name != "OnClick")
{
// Programmatic Code
}
else
{
// User Code
}
调用堆栈如下所示:
因此,您需要返回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");
}