Vb.net 窗体。加载事件未触发,窗体显示
我担心我的代码显然有问题,但我遇到了这样一种情况,即当我创建和显示表单时,Vb.net 窗体。加载事件未触发,窗体显示,vb.net,winforms,events,event-handling,Vb.net,Winforms,Events,Event Handling,我担心我的代码显然有问题,但我遇到了这样一种情况,即当我创建和显示表单时,Form.Load事件没有触发 表单不是子类化的(正如我在一些搜索中看到的那样),当我在调试器中单步执行代码时,不会出现任何错误 我在IDE创建的表单加载函数上设置了一个断点(该函数有Handles MyBase.load签名后缀),但从未到达断点,表单确实显示并工作 表单在构造函数中被传递了三个参数,但是在执行任何其他操作之前调用了initializeComponent()函数 代码: 表单加载函数如下所示(但由于未触发
Form.Load
事件没有触发
表单不是子类化的(正如我在一些搜索中看到的那样),当我在调试器中单步执行代码时,不会出现任何错误
我在IDE创建的表单加载函数上设置了一个断点(该函数有Handles MyBase.load
签名后缀),但从未到达断点,表单确实显示并工作
表单在构造函数中被传递了三个参数,但是在执行任何其他操作之前调用了initializeComponent()
函数
代码:
表单加载函数如下所示(但由于未触发事件,因此不会实际执行该函数)
代码:
我可能会补充说,我正在对一些控件和argA
对象使用一些数据绑定,但如果这产生错误,我想我会看到这一点(我在debugger>exceptions窗口中将CLR Executions设置设置为Thown)
您知道为什么会发生这种情况吗?您遇到的问题可能是由于应用程序需要在执行“其他代码”之前完全加载表单。这可能是由于其他代码处理表单上尚未完成加载的对象。您可以使用在load函数中启用的计时器来执行其他代码。这样,您就不会有任何计时问题,您可以先加载表单,然后在一瞬间从计时器中运行所需的代码。这里是另一个想法 如果将所有异常类型(不仅仅是CLR)设置为抛出而不是用户未处理,会发生什么。应用程序是否有任何漏洞
另外,请仔细检查,您处于调试模式,对吗?马特在这一点上可能是正确的。您是否尝试过这样调整代码:
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
如果出现messagebox,则表示事件是在参数初始化之前触发的。它还可以解释有关关闭/打开表单的“奇怪”行为
您是否尝试过在“显示”事件中运行argA操作?您的windows窗体是否继承自基本页?如果是这样,则基本页可能还具有表单加载事件处理程序。在该基页表单加载事件处理程序中,您可能会发现正在抛出的异常。因此,它正在退出基本页表单加载事件处理程序,而不是在继承的windows表单中启动表单加载事件处理程序。不确定这是否有帮助,但我遇到了这个问题,因为有人错误地删除了句柄Me.load。我看到你在显示MyBase。加载尝试将其更改为我。加载 我也有类似的问题,问题是数据绑定中的错误。省略用于数据绑定的代码并尝试一下。我认为加载事件处理程序将被命中。然后看看数据绑定部分出了什么问题。好的,我也有同样的问题(我想),这里的线索也有帮助。这是数据绑定(有点)
我将一些控件的属性绑定到设置,当我删除这些设置时,表单加载事件停止运行。删除了绑定,现在它又开始运行了。我刚刚遇到了一个类似的问题(它出现在
显示的事件中,不是加载,但根本原因是相同的)。原因隐藏在一个祖先的内心深处——抛出了一个未经处理的NullReferenceException
,该异常以某种方式被“静音”
我用F11进行了大量调试后发现了它
但是。。。在写这个答案时,我发现了这个
只需在Main()方法中添加Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException)
如果您使用的是64位机器,它会为您提供解决方案(在我的情况下也可以)。事实证明,我并没有在表单上使用Show方法,而是使用了user32.dll ShowWindow调用。这意味着表单仍然出现,但由于从未调用dotNet Show方法,因此从未触发加载事件。我遇到了类似的问题。第一次打开表单时,不会触发加载事件,但第二次打开时,一切都会正常。问题出在我的一个文本框上,该文本框绑定到我从数据库中删除的一个字段(sql server-我以相当标准的方式使用数据集、TableAdapter和bindingsources)
确保窗体上所有数据绑定的控件都有数据集中存在的字段,并且数据集准确反映了基础数据库表(最简单的方法是使用“数据源”窗口(菜单-数据-显示数据源)上的“使用wizzard配置数据源”按钮来完成最后一步操作)然后再次使用它将表添加回-这应该确保所有数据都匹配
希望这有帮助。也有同样的问题。检查了我的数据绑定后,一切看起来都正常。开始思考,即使表单已关闭,可能.NET也不确定(过去,有时候表单只是隐藏的,而不是真正关闭的)
我添加了事件处理程序FormClosed,并在其中放了一行:
Private Sub frmScheduleInquiry_FormClosed(sender As Object, e As System.Windows.Forms.FormClosedEventArgs) Handles Me.FormClosed
Me.Dispose()
End Sub
问题解决了!问题解决了
花了4个小时,终于从这些答案中找到了线索。
在我的例子中,表单上有两个TextBox控件绑定到一个具有相应列的BindingSource,表单上仍然有该BindingSource,但发生的情况是,我从基础数据库表中删除了一列,因此表单上仍然有一个TextBox存在,指向具有BindingSource的列,实际上没有列umn是这样的,因为我删除了!…此lead Form.load事件没有触发…最终修复
感谢你们所有人。我知道这是一篇老文章,但我想如果有人
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
Private Sub frmScheduleInquiry_FormClosed(sender As Object, e As System.Windows.Forms.FormClosedEventArgs) Handles Me.FormClosed
Me.Dispose()
End Sub
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
<startup useLegacyV2RuntimeActivationPolicy="true">
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/>
</startup>