.net 如何防止CheckBox.Checked的赋值语句引发CheckChanged事件?

.net 如何防止CheckBox.Checked的赋值语句引发CheckChanged事件?,.net,vb.net,events,controls,.net,Vb.net,Events,Controls,给定 …除了禁用控件外,我如何防止对Checked的分配引发CheckChanged事件?我在MFC中长大,只有当U S E R更改控件的状态时,事件才会发生。柔蒂在想什么?是否真的无法区分来自用户的事件和来自我自己的赋值语句的事件?哎呀 无论引发事件的原因是什么,引发事件都是完全有效的,因为CheckChanged事件只会在Checked属性发生更改时通知您 如果试图避免无限循环,则必须尝试添加条件: Dim cb As CheckBox = New CheckBox AddH

给定


…除了禁用控件外,我如何防止对Checked的分配引发CheckChanged事件?我在MFC中长大,只有当U S E R更改控件的状态时,事件才会发生。柔蒂在想什么?是否真的无法区分来自用户的事件和来自我自己的赋值语句的事件?哎呀

无论引发事件的原因是什么,引发事件都是完全有效的,因为
CheckChanged
事件只会在
Checked
属性发生更改时通知您

如果试图避免无限循环,则必须尝试添加条件:

    Dim cb As CheckBox = New CheckBox
    AddHandler cb, AddressOf cb_CheckChanged
    cb.Checked = True 

如果是一次性的(例如,您正在使用默认状态绘制GUI),只需交换第二行和第三行代码。否则,很有趣的是,您试图责怪MS实现了完美的逻辑实现。“真的不可能区分用户和我的赋值语句吗?”一点也不难,您的赋值语句是可以禁用控件(或其处理程序)的语句当需要更改控件时,然后在完成后重新启用它们。真正的问题是,为什么你的代码不能分辨出它自己和用户之间的区别?实际上,禁用控件也不会阻止提升。因此,我不得不在我的代码中乱扔丑陋的布尔人。这对于复选框和单选按钮尤其麻烦。相对于MFC,我对这个设计变更不感兴趣。我是根据30年的经验来做这件事的。这30年的经验现在对你没有帮助。NET中的方法与Windows中的工作方式有着根本的不同,Windows是一个更强大的观察者模式模型,任何人都可以观察。包括完全忘记是您的代码更改了选中状态而不是用户的代码的代码。如果你有一堆bool标志,那么你就做错了。你需要进行大脑移植的唯一方法就是努力摆脱它们。
If Not cb.Checked Then
  cb.Checked = True
End If