【问题标题】:How can I prevent an assignment statement to CheckBox.Checked from raising the CheckChanged event?如何防止 CheckBox.Checked 的赋值语句引发 CheckChanged 事件?
【发布时间】:2013-01-14 19:24:12
【问题描述】:

给定

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

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

【问题讨论】:

  • 如果它是一次性的(例如,您正在使用默认状态绘制 GUI),只需交换第二行和第三行代码。否则,你试图责怪 MS 做出了一个完全合乎逻辑的实现,这很有趣。
  • "真的不可能区分用户和我的赋值语句吗?" 一点也不难,你的赋值语句是可以禁用控件(或其处理程序)当它需要更改控件时,然后在完成后重新启用它们。真正的问题是为什么你的代码不能区分它自己和用户?
  • 实际上,禁用控件也不会阻止加注。因此,我不得不在我的代码中乱扔丑陋的布尔值。这对于复选框和单选按钮来说尤其麻烦。我对这种相对于 MFC 的设计更改确实有过错。我基于 30 年的经验。
  • 30 年来一直以同样的方式做事现在对您没有帮助。 .NET 中的方法与它在 Windows 中的工作方式根本不同,Windows 是一种更强大的观察者模式模型,任何人都可以观察。包括完全没有意识到是您的代码而不是用户更改了检查状态的代码。如果你有一堆布尔标志,那么你做错了。获得所需脑移植的唯一方法是努力摆脱它们。

标签: .net vb.net events controls


【解决方案1】:

引发事件是完全有效的,而不管导致事件的原因是什么,因为CheckChanged 事件只会告诉您Checked 属性何时发生变化。

如果您想避免无限循环,您一定会遇到尝试添加条件:

If Not cb.Checked Then
  cb.Checked = True
End If

【讨论】:

    猜你喜欢
    • 2018-12-01
    • 1970-01-01
    • 2019-06-22
    • 2016-09-07
    • 2015-03-13
    • 1970-01-01
    • 1970-01-01
    • 2011-10-24
    • 1970-01-01
    相关资源
    最近更新 更多