Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vb.net 为什么在窗体显示事件之前触发Windows窗体控件单击事件?_Vb.net_Winforms - Fatal编程技术网

Vb.net 为什么在窗体显示事件之前触发Windows窗体控件单击事件?

Vb.net 为什么在窗体显示事件之前触发Windows窗体控件单击事件?,vb.net,winforms,Vb.net,Winforms,我有一个表单可以实例化并打开另一个表单。直到最近,它还工作得很好,在重新设计第二个表单时,表单上单选按钮上的单击事件在表单加载后开始被触发。我在form.Showed事件中有代码,但它从未被调用(该表单在单选按钮单击事件期间崩溃,因为它不应该这么快被调用)。调用堆栈窗口表明PictureBox click事件也在RadioButton click事件之前或之后触发 表单加载: Private Sub Form1_Load(sender As Object, e As EventArgs) Ha

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

表单加载:

 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

有时,表单初始化时会触发表单控件。这听起来可能像一个bug,但微软称之为“设计”

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

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


  • 我没有足够的代表发布调用堆栈窗口的图像。嗯,这很奇怪。我从来没有听说过。如果我不再次更改表单,这些事件是随机的还是总是会触发?我不确定。它们似乎一直在发射,直到在中使用一个标志来阻止处理程序执行,然后我就忘了它。但这似乎是随机的,从一个项目到另一个项目。另一个解决方案是在表单初始化后分配事件处理程序,但我认为这在将来的维护中会有点混乱。@TravelinMax-对于xpda的第1点,您永远不应该使用默认表单实例。使用表单时,应始终执行以下操作:
    Dim frm As New Form1。。。frm.Show()等
    如果您发现自己只是在
    Show
    ShowDialog
    中使用表单类的名称,那么您使用的是默认表单实例,应该避免使用。出于兼容性的目的,它们是VB6的遗留版本。@ChrisDunaway Yes my form1是默认表单(打开程序时加载的表单),它实例化了一个新表单2,然后显示它。