【问题标题】:Why is Windows form control click event being fired before form shown event?为什么在窗体显示事件之前触发 Windows 窗体控件单击事件?
【发布时间】:2015-02-17 09:24:10
【问题描述】:

我有一个实例化并打开另一个表单的表单。直到最近它工作正常,同时重新利用表单上的单选按钮上的单击事件在表单加载后开始被触发的第二个表单。我在 form.shown 事件中有代码,但它从未被调用(表单在单选按钮单击事件期间崩溃,因为它不应该这么快被调用)。调用堆栈窗口表明在 RadioButton 点击​​事件之前或之后也触发了 PictureBox 点击事件。

表单加载:

 Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    lblCountdown.TextAlign = ContentAlignment.TopCenter
    lblCountdown.Font = New Font(lblCountdown.Font.Name, lblCountdown.Font.Size + 10, lblCountdown.Font.Style)

    radFirstRunContinue.Checked = False
    radFirstRunContinue.Visible = False

    For Each picBox As PictureBox In tlpButtonTableLayout.Controls
        AddHandler picBox.Click, AddressOf Me.PictureBox_click
    Next
End Sub

【问题讨论】:

  • 我没有足够的代表来发布调用堆栈窗口的图像。

标签: vb.net winforms


【解决方案1】:

有时表单控件会在表单初始化时触发。这听起来像是一个错误,但微软称其为“设计使然”。

  1. 检查并确保只加载了一个表单实例。如果您从外部访问表单中的变量或控件,它将启动隐式表单加载。要检查这一点,只需在 Load 事件处理程序的开头设置一个断点。

  2. 您可以使用一个标志(例如,初始化为 true),控制处理程序可以使用该标志来查看正在加载的表单。您可以在表单显示事件中重置标志。

【讨论】:

  • 嗯,这很奇怪。我从来没有听说过。是随机的,还是如果我不再更改表单,这些事件是否总是会触发?
  • 我不确定。他们似乎一直在触发,直到使用一个标志来阻止处理程序执行,然后我忘记了它。但从项目到项目似乎是随机的。另一种解决方案是在表单初始化之后分配事件处理程序,但我认为这在以后的维护中会有点混乱。
  • @TravelinMax - 关于 xpda 的第 1 点,您应该从不使用默认的 Form 实例。使用表单时,您应该始终这样做:Dim frm As New Form1 ... frm.Show() etc. 如果您发现自己只是使用带有ShowShowDialog 的表单类的名称,那么您使用的是默认表单实例,应该避免这种情况。出于兼容性目的,它们是从 VB6 继承而来的。
  • @ChrisDunaway 是的,我的 form1 是默认表单(打开程序时加载的那个),它实例化一个新的 form2 然后显示它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多