我在Symbol 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
这一切都正常,当我关闭frmMain时,它会按预期退出应用程序。
但是,如果Sub 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上的“关闭”按钮的单击事件中,我添加了以下代码:
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事件没有发生一样。
我做错了什么?
答案 0 :(得分:1)
我无法看到整个应用程序是如何组合在一起的,但我会通过删除“else”子句来提出这个小改动:
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() ' Is this what populates your database???
' Else (removed the else clause)
End If
If File.Exists(SETTINGS_LOCALDB) Then ' now it is OK to run, correct?
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
End If
答案 1 :(得分:1)
您的主窗体无法关闭的原因是因为您的应用程序“卡在”对话框结束事件的调用堆栈中,因为您启动了主窗体的Windows消息循环。
我建议您稍微调整一下代码。
而不是在“main”子中进行有效性检查,而是加载主窗体:
Application.Run(New frmMain())
将计时器放到主表单上并设置一个非常快的间隔(例如10毫秒)。在主窗体的加载事件中启用它。像这样实现Tick事件处理程序(请注意,我的VB语法可能并不完美,我在这里wing)):
Sub TmrOneShot_Tick(ByVal sender as Object, ByVal e as System.EventArgs)
'prevent timer from firing again.
tmrOneShot.Enabled = False;
Dim bContinue as Boolean = False;
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() ' Is this what populates your database???
'analyze result of update form to determine if you should continue...
bContinue = WasUpdateDataOperationSuccessful();
End If
If bContinue Then
If SystemUserSecurityId() = Nothing Then
Dim login As frmLogin = New frmLogin()
bContinue = login.ShowDialog() = DialogResult.OK
if bContinue Then
DebugTrace("Init - login complete, starting application.")
End If
End If
End If
If Not bContinue Then
'can't continue, terminate app
Application.Exit()
End if
End Sub