【问题标题】:Form.Load event not firing, form showingForm.Load 事件未触发,表单显示
【发布时间】:2011-05-07 00:10:25
【问题描述】:

我担心我的代码有明显的问题,但是我遇到了一种情况,即在我创建和显示我的表单时,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 执行设置设置为 Thown )

任何想法为什么会发生这种情况?

【问题讨论】:

    标签: vb.net winforms events event-handling


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

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

        过去我曾看到这会导致混合模式程序集异常。在这种特殊情况下,主表单加载时没有异常,也没有执行任何表单加载代码。

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

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

        【讨论】:

          【解决方案4】:

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

          【讨论】:

            【解决方案5】:

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

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

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

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

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

            【讨论】:

            • 如果你不能得到异常,可能是因为这个问题stackoverflow.com/questions/4933958/… 在这种情况下,快速修复是在不调试的情况下运行,看看会发生什么。
            • 我已经两次遇到这种情况,原因相同。当我将该属性绑定到 DateTimePicker 时,我的对象将 DateTime 属性设置为 DateTime.MinValue,它会静默失败并且不运行表单加载事件处理程序。我的解决方案是将属性默认设置为 DateTimePicker.MinimumDateTime。值之间的差异是 DateTime.MinValue = 01/01/0001 和 DateTimePicker.MinimumDateTime = 1/1/1753
            • 这拯救了我的一天。谢谢
            • 这为我节省了很多调试时间。就我而言,我删除了绑定到控件的设置值。你一定喜欢数据绑定。我的意思是,它是 TOS 的第 4536 行,'..用户,您,特此同意爱数据绑定,否则'。
            【解决方案6】:

            同样的问题,我重写了设计器并修复了它。设计器正在加载然后崩溃(当然是静默),因此 form_load 没有触发。

            【讨论】:

              【解决方案7】:

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

              希望对你有帮助

              【讨论】:

              • 是的。谢谢你。删除设置后,我在所有解决方案中搜索 My.MySettings 以将其从各种设计器文件中删除。现在它会触发那些珍贵的 Load 事件。
              【解决方案8】:

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

              我遇到了与最初发布的问题中所述相同的问题,但我在表单上没有任何数据绑定字段。我发现问题在于我使用的是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
              

              我希望这对某人有所帮助。 快乐编码...

              【讨论】:

                【解决方案9】:

                解决了....

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

                谢谢大家..

                【讨论】:

                  【解决方案10】:

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

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

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

                  问题解决了!

                  【讨论】:

                    【解决方案11】:

                    我遇到了类似的问题。第一次打开表单时,不会触发加载事件,但第二次打开时,一切都会好起来的。问题调整为我的文本框之一,该文本框绑定到我已从数据库中删除的字段(sql server - 我以相当标准的方式使用数据集、表适配器和绑定源)。

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

                    希望这会有所帮助。

                    【讨论】:

                      【解决方案12】:

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

                      【讨论】:

                        【解决方案13】:

                        好的,我遇到了同样的问题(我认为),这里的线索有所帮助。这是数据绑定(有点)

                        我有一些绑定到设置的控件的属性,当我删除这些设置时,表单加载事件停止运行。删除了绑定,现在它又开始运行了。

                        【讨论】:

                        • 这只是在 Visual Studio 2015 中发生在我身上。在我的例子中,我更改了控件绑定到的应用程序设置的名称,即使设计器表明它已经重构了绑定成功,我的 Load 事件没有触发。将绑定更改为随机的其他应用程序设置,然后再次为我修复它。
                        【解决方案14】:

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

                        【讨论】:

                          【解决方案15】:

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

                          【讨论】:

                            【解决方案16】:

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

                            【讨论】:

                              【解决方案17】:

                              关于这一点,马特可能是对的。您是否尝试过像这样调整代码:

                              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 操作?

                              【讨论】:

                                【解决方案18】:

                                这是另一个想法。

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

                                另外,请仔细检查一下,您是否处于调试模式?

                                【讨论】:

                                  【解决方案19】:

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

                                  【讨论】:

                                  • 这似乎是我能想象的最接近正在发生的事情......事实上,如果我调用 form.show,然后调用 form.hide,然后再次调用 form.show,Load 事件正在触发...我发现这种非常奇怪的行为,并想找到问题的根源。
                                  猜你喜欢
                                  • 2012-04-09
                                  • 2017-05-08
                                  • 1970-01-01
                                  • 1970-01-01
                                  • 1970-01-01
                                  • 1970-01-01
                                  • 2013-03-12
                                  • 2016-07-13
                                  • 2014-08-07
                                  相关资源
                                  最近更新 更多