Vb.net 调用Application.Run(New myForm())在Sub Main外部时不工作
我正在符号MC50上使用Compact Framework 3.5 在我的Sub-Main中,它首先检查数据库是否存在。如果是,则显示使用以下代码的登录屏幕:Vb.net 调用Application.Run(New myForm())在Sub Main外部时不工作,vb.net,compact-framework,Vb.net,Compact Framework,我正在符号MC50上使用Compact Framework 3.5 在我的Sub-Main中,它首先检查数据库是否存在。如果是,则显示使用以下代码的登录屏幕: Dim login As frmLogin = New frmLogin() If login.ShowDialog() = DialogResult.OK Then Application.Run(New frmMain()) End If If SystemUserSecuri
Dim login As frmLogin = New frmLogin()
If login.ShowDialog() = DialogResult.OK Then
Application.Run(New frmMain())
End If
If SystemUserSecurityId() = Nothing Then
Dim login As frmLogin = New frmLogin()
If login.ShowDialog() = DialogResult.OK Then
DebugTrace("Init - login complete, starting application.")
Application.Run(New frmMain())
End If
End If
Me.Hide()
这一切都正常工作,当我关闭frmMain时,它会按预期退出应用程序
但是,如果数据库签入子Main失败,我将调用另一个表单的ShowDialog()方法,该表单用于从实时服务器创建和填充数据库。以下是调用此表单的代码:
If Not File.Exists(SETTINGS_LOCALDB) Then
databaseExists = False
MessageBox.Show("Local DB does not exist. The database must be created before using the application.")
Dim update As frmUpdateData = New frmUpdateData()
update.ShowDialog()
Else
.....
End If
我遇到的第一个问题是,当frmUpdateData关闭时,Sub Main中的其余代码没有执行,因此Application.Run从未被命中
因此,在frmUpdateData上关闭按钮的单击事件中,我添加了以下代码:
Dim login As frmLogin = New frmLogin()
If login.ShowDialog() = DialogResult.OK Then
Application.Run(New frmMain())
End If
If SystemUserSecurityId() = Nothing Then
Dim login As frmLogin = New frmLogin()
If login.ShowDialog() = DialogResult.OK Then
DebugTrace("Init - login complete, starting application.")
Application.Run(New frmMain())
End If
End If
Me.Hide()
所有这些代码都被命中,frmMain确实加载了。但是,当我单击右上角的“关闭”按钮时,不会发生任何事件。就好像Windows事件没有发生一样
我做错了什么?我看不出您的整个应用程序是如何组合在一起的,但我将通过删除“else”条款来提出这一小改动:
主窗体无法关闭的原因是您的应用程序被“卡住”在对话框关闭事件的调用堆栈中,因为这是您启动主窗体的windows消息循环的地方 我建议您重新构造代码 不要在“主”子窗体中进行有效性检查,而是加载主窗体:
Application.Run(New frmMain())
在主窗体上放置一个计时器,并设置一个非常快的间隔(比如10毫秒)。在主窗体的加载事件中启用它。像这样实现Tick事件处理程序(请注意,我的VB语法可能并不完美,我在这里使用它):
我不确定这是否有用,但我会尝试使用Application.Run来显示您的frmLogin和frmUpdate数据表单,而不是调用ShowDialog。我不知道当您不在应用程序消息循环中时.NET对您显示对话框和消息框有多友好。