Form.Load事件未触发,表单显示

时间:2010-11-09 02:16:02

标签: vb.net winforms events event-handling

我担心我的代码存在明显错误,但是我遇到了一种情况,即当我创建并显示我的表单时Form.Load事件没有触发。

表单不是子类(因为我在某些搜索中看到了一些问题),而且当我逐步调试调试器中的代码时,我没有收到任何错误。

我在IDE创建的表单加载函数(它具有Handles MyBase.Load签名后缀)上设置了断点,但是从未到达断点并且表单显示并正常工作。

表单在构造函数中传递三个参数,但在完成任何其他操作之前调用IntializeComponent()函数。

代码:

Public Sub New(ByVal argA As Object, ByVal argB As Object, ByVal mode As FormMode)

    ' This call is required by the Windows Form Designer.
    InitializeComponent()

    ' Other code here,
    ' No errors generated
    '

End Sub

表单加载函数如下所示(但由于事件未被触发,因此实际上从未执行过。)

代码:

Private Sub frmInstrumentEditor_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    If Not argA Is Nothing Then ' argA set in constructor
          ' Operations using argA
    End If
End Sub

我可能会添加我正在使用一些控件和argA对象的数据绑定,但是如果这产生错误我认为我会看到这个(我将CLR Execpetions设置设置为调试器中的Thown&gt ;例外窗口)

为什么会出现这种情况的任何想法?

19 个答案:

答案 0 :(得分:28)

我刚遇到类似的问题(它出现在Shown事件中,而不是Load,但根本原因是相同的)。原因隐藏在其中一个祖先的深处 - 有一个未处理的NullReferenceException抛出,这个异常以某种方式被“静音”。

我在用F11进行大量调试后发现了它。

但是......在写这个答案时我发现了post on SO

只需在Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException)方法中添加Main()

如果您使用的是64位计算机,它会为您提供解决方案(在我的情况下也适用)。

答案 1 :(得分:7)

我有类似的问题。在第一次打开表单时,加载事件不会被触发,但是第二次打开时,一切都会好的。这个问题被调整为我的一个文本框,它被绑定到我从数据库中删除的字段(sql server - 我以相当标准的方式使用数据集,tableadaptors和bindingsources)。

确保表单上数据绑定的所有控件都包含数据集中存在的字段,并且数据集是底层数据库表的准确反映(最简单的方法是使用“配置”带有wizzard数据源“数据源窗口上的按钮(菜单 - 数据 - 显示数据源)”并删除表格。然后再次使用它来添加表格 - 这应该确保所有数据都匹配。

希望这有帮助。

答案 2 :(得分:4)

好的,我有同样的问题(我想),这里的线索有帮助。这是数据绑定(排序)

我将某些控件的属性绑定到设置,当我删除这些设置时,表单加载事件停止运行。删除了绑定,现在它再次运行。

答案 3 :(得分:1)

这是另一个想法。

如果将所有异常类型(不仅仅是CLR)设置为抛出而不是用户未处理,会发生什么。应用程序是否会破坏任何地方?

另外,只是要仔细检查一下,你处于调试模式吗?

答案 4 :(得分:1)

我遇到了完全相同的问题。事实证明我已经将一些ApplicationsSettings属性添加到表单TextBox控件,但后来想删除它们。我思考我已经清除了所有内容,但显然我没有 - 这也是导致Form_Load()(也许还有其他事件)无法触发的原因。删除然后重新添加有问题的TextBox就可以了。

希望这有帮助

答案 5 :(得分:1)

...解决

花了4个小时,终于从这个答案中找到了线索。 在我的情况下,我在绑定到BindingSource的表单上有几个TextBox控件与各自的列,我仍然在表单上有绑定源但发生了什么,我从底层数据库表中删除了一列,所以在表单上还有一个TextBox存在指向带有bindingsource的列,实际上没有像那样的列因为我删除了!.....这个导致Form.load事件没有触发........终于修复了..

感谢你们所有人..

答案 6 :(得分:1)

有同样的问题。检查了我的数据绑定,一切看起来都不错。不得不思考,即使表格已关闭,也许.NET不确定(过去,有时形式只是隐藏而不是真正关闭)。

我添加了事件处理程序FormClosed并在其中添加了一行:

Private Sub frmScheduleInquiry_FormClosed(sender As Object, e As   System.Windows.Forms.FormClosedEventArgs) Handles Me.FormClosed
    Me.Dispose()
End Sub

问题解决了!

答案 7 :(得分:1)

我有类似的问题,问题是数据绑定中的错误。省略数据绑定代码并尝试一下。我认为加载事件处理程序将被命中。然后看看数据绑定部分有什么问题。

答案 8 :(得分:1)

您的Windows窗体是否继承自基页?如果是这样,基页可能还有一个Form Load事件处理程序。在该基页Form Load事件处理程序中,您可能会发现正在抛出的异常。因此它退出基页表单加载事件处理程序,而不是在继承的窗体窗体中触发表单加载事件处理程序。

答案 9 :(得分:1)

您遇到的问题可能是由于应用程序需要在您执行“其他代码”之前完全加载表单。这可能是由于其他代码处理表单上尚未完成加载的对象。您可以使用在load函数中启用的计时器来执行其他代码。这样您就没有任何计时问题,您可以先加载表单,然后一瞬间,从计时器运行您想要的代码。

答案 10 :(得分:0)

我有类似的问题。事实证明我没有在表单上使用Show方法 - 而是使用user32.dll ShowWindow调用。这意味着表单仍然出现,但Load事件从未被触发,因为从未调用过dotNet Show方法。

答案 11 :(得分:0)

不确定这是否会有所帮助,但我刚遇到这个问题,因为有人错误地删除了Handles Me.Load。我看到你显示MyBase.Load尝试将其更改为Me.Load。

答案 12 :(得分:0)

马特对这个问题可能是正确的。您是否尝试过像这样调整代码:

Private Sub frmInstrumentEditor_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
If Not argA Is Nothing Then ' argA set in constructor
      ' Operations using argA
Else
      MessageBox.Show("argA has not been set")
End If
End Sub

如果出现消息框,则表示在初始化参数之前触发了该事件。它还会解释关闭/打开表格的“奇怪”行为。

您是否尝试在“已显示”事件中运行argA操作?

答案 13 :(得分:0)

我知道这是一篇旧帖子,但我认为如果有人在搜索此问题,我对此问题的修复可能有所帮助。

我遇到了最初发布的问题中所述的相同问题,但我在表单上没有任何数据绑定字段。我发现问题在于我使用的是CurrentDeployment.CurrentVersion方法,这导致了无声问题。我将应用程序从调试模式设置为发布,问题仍然存在。通过反复试验,我说出了定义方法Dim xVersion As Version = ApplicationDeployment.CurrentDeployment.CurrentVersion  和presto ...它现在像往常一样工作。

我最后更改了以下代码的原始代码。

    Dim xVersion As Version = ApplicationDeployment.CurrentDeployment.CurrentVersion
    sysVersion = String.Format("{0}.{1}{2}.{3}", xVersion.Major, xVersion.Minor, xVersion.Build, xVersion.Revision)

新代码

#If (DEBUG) Then
    sysVersion = "[Debug mode]"
#Else
    Dim xVersion As Version = ApplicationDeployment.CurrentDeployment.CurrentVersion
    sysVersion = String.Format("{0}.{1}{2}.{3}", xVersion.Major, xVersion.Minor, xVersion.Build, xVersion.Revision)
#End If

我希望这有助于某人。 快乐的编码...

答案 14 :(得分:0)

同样的问题,我重写了设计师并修复了它。设计师正在加载然后崩溃(当然是默默地),并且form_load因此没有被解雇。

答案 15 :(得分:0)

有同样的问题,但原因完全不同。 使用form.Show()而不是form.ShowDialog()

显示表单

答案 16 :(得分:0)

在构建和运行.NET 4.0 WinForms应用程序时,我遇到了这种症状,该应用程序加载了一系列较旧的程序集(.NET 2.0; .NET 1.1)。

过去,我已经看到这会导致混合模式程序集异常。在这种情况下,主窗体将无例外地加载,并且不会执行其任何窗体加载代码。

就我而言,解决方案是在App.config文档中设置useLegacyV2RuntimeActivationPolicy="true"

<startup useLegacyV2RuntimeActivationPolicy="true">
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/>
</startup>

答案 17 :(得分:0)

确保IDE顶部的“解决方案配置”框显示“调试”。 我发现,如果显示“ Release”,则调试器未捕获“ Load”方法。

答案 18 :(得分:0)

在我的情况下,主窗体在设计器中设置了 WindowState:Maximized 。这导致窗口在Load事件触发之前在屏幕上绘制。

相关问题