如何防止在.NET中的表单初始化时触发值更改事件?

Cod*_*ile 20 .net events winforms

考虑一个带有几个单选按钮和一个复选框的简单.NET表单.

每个单选按钮都有一个CheckedChanged处理程序设置,它根据复选框的状态执行某些操作.

我的问题是,当我初始化要检查的默认单选按钮时(从设计器属性窗口),为该单选按钮触发CheckedChanged事件,但Checkbox尚未初始化,所以我得到一个空指针异常或者处理程序中使用了错误的值.无论哪种方式,我都不希望运行处理程序代码,除非用户在加载表单后选择一个单选按钮.

我目前通过不初始化单选按钮来解决这个问题,但我最终需要设置默认值,最好的位置来自设计师.我也可以在表单完全加载之前添加一个未设置为true的布尔字段,如果这是假的,则不处理事件,但这是一个脏的黑客.

我该怎么做才能阻止该处理程序运行其代码?

Han*_*son 28

为了让它感觉稍微脏一点,如果你在表单的构造函数中初始化控件,你可以使用表单IsHandleCreated属性而不是你自己的bool来检查它是否应该实际验证.
我认为通常你不想在它第一次显示之前验证任何东西,并且在它出现之前不会创建句柄.

代码示例:

Private Sub myRadioButton_CheckedChanged(sender As Object, e As EventArgs) Handles myRadioButton.CheckedChanged
If myRadioButton.Checked AndAlso myRadioButton.IsHandleCreated Then
    'Do Work
End If
End Sub
Run Code Online (Sandbox Code Playgroud)

  • 是的,它不那么脏,而且可以使用!我遇到了同样的问题,在事件中检查表单“ IsHandleCreated”可以解决所有问题! (2认同)
  • 这应该是答案. (2认同)

Fas*_*tAl 21

"我也可以在表单完全加载之前放置一个未设置为true的布尔字段,如果错误则不处理事件,但这是一个肮脏的黑客攻击."

它也是最简单和最好的方法!

让我们说.NET提供了一种简洁的方法来打开和关闭所有事件处理程序,直到表单加载.即使只是你正在处理的那些.它仍然不够灵活,无法禁用您想要启用的功能,但禁用您没有启用的功能.通常表单设置发生,您希望事件触发.如果没有事件发生,表单也不会正确构建.

  • 写完这个答案后,我不得不洗个澡. (24认同)
  • 还是觉得很脏:) (11认同)