【问题标题】:Why is ComboBox SelectedIndexChanged being called before form load?为什么在表单加载之前调用 ComboBox SelectedIndexChanged?
【发布时间】:2016-03-20 01:26:10
【问题描述】:

为什么Private Sub combobox_SelectedIndexChanged(sender As Object, e As EventArgs) Handles combobox.SelectedIndexChanged 在表单出现之前调用? 据我了解,当用户更改 mycombobox 的选定索引时,应该ONLY调用此函数?我错了吗?

如何阻止它自动运行?

【问题讨论】:

  • 以编程方式更改所选索引时也会发生SelectedIndexChanged 事件。
  • 所选索引以编程方式更改是什么意思?我无法理解...
  • 表示当组合框选择通过代码改变时。在您的情况下,可能会在填充组合框列表项或设置初始选择时发生。
  • 如何阻止它?还是使用其他事件?
  • @BAE 你应该使用SelectionChangeCommitted 事件。这仅在用户选择一个选项时触发

标签: vb.net combobox


【解决方案1】:

您可以使用布尔标志来指示何时“安全”处理事件,或者您可以使用替代语法在加载表单并完成所有初始化之后添加事件处理程序。

为此,您使用AddHandler 语法:

AddHandler combobox.SelectedIndexChanged, AddressOf combobox_SelectedIndexChanged

希望对你有帮助

编辑:

使用AddHandler 语法,您必须确保不要将Handles 子句添加到您的事件处理程序声明中:

Private Sub combobox_SelectedIndexChanged(sender As Object, e As EventArgs) 
'you event handler code
End Sub

然后,通常在表单的 OnLoad 覆盖的末尾,您将使用 AddHandler

Public Class Form1

    Protected Overrides Sub OnLoad(e As EventArgs)
        MyBase.OnLoad(e)

        ' Initialization code/whatever

        AddHandler ComboBox1.SelectedIndexChanged, AddressOf combobox_SelectedIndexChanged

    End Sub

    Private Sub combobox_SelectedIndexChanged(sender As Object, e As EventArgs)
    'Your event handler code
    End Sub

End Class

【讨论】:

  • 我认为事件处理程序 ONLY 可以自动添加。如何阻止它们自动添加,然后在表单加载功能中添加它们?
  • 不要在处理程序声明中添加Handles combobox.SelectedIndexChanged 子句。
  • 如果需要,您甚至可以使用RemoveHandler 删除事件处理程序。这使您可以很好地控制何时应该(或不)调用处理程序。您可以根据需要在代码中动态添加和删除它们。
  • @LucMorin 另一种选择是使用SelectionChangeCommited Event,而不是标志或处理程序,因为此事件仅在用户更改所选项目时引发。
  • 像其他任何解决方案一样的好解决方案,但必须认识到@Codexer 提到了最好的方法,并且在我看来,动态添加/删除事件处理程序应该只考虑动态创建的对象,否则,这是生成某种意大利面条代码的起点,那么我认为这是一种不好的做法(因为实际上并不需要动态关联事件处理程序而不是使用 Handles 子句,在此场景)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-21
  • 1970-01-01
  • 2018-09-17
  • 1970-01-01
相关资源
最近更新 更多