我有一个行为奇怪的VB.NET应用程序(或者可能并不奇怪,我只是遗漏了一些东西)。
我有一个登录表单,当用户单击“确定”并成功登录时,它会加载主申请表。
但是,当我显示主窗体并关闭登录表单时,应用程序将触发关闭事件。
这是因为应用程序认为登录表单是唯一打开的表单,因此会触发关闭事件吗?
这是登录例程的代码,当我调用Me.Close()时,就是关闭事件被触发的时候。我不按顺序做事吗?我以前在VB6中这样做没有问题(我知道它们有很多不同)。
注意,在frmMain中也没什么,无论我尝试打开什么形式,都会发生这种情况。
感谢。
Private Sub btnOK_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnOK.Click
'iLoginResult = 0 : Success
' 1 : Invalid user name or password
' 2 : Other login error
' 3 : User not authorized
Dim iLoginResult As Integer = 2
Dim sTopLabel As String = ""
Dim sBottomLabel As String = ""
Me.Cursor = Cursors.WaitCursor
Try
If Me.txtUserName.Text.ToString.Trim = "" Or Me.txtPassword.Text.ToString.Trim = "" Then
MessageBox.Show("Enter a user name and password before continuing.", "DocGen", MessageBoxButtons.OK, MessageBoxIcon.Warning)
Exit Try
End If
iLoginResult = modGeneral.bLogin(Me.txtUserName.Text.ToString.Trim, Me.txtPassword.Text.ToString.Trim)
Select Case iLoginResult
Case 1 : sTopLabel = "The user name or password is incorrect" : sBottomLabel = "Check your user name then type your password again."
Case 2 : sTopLabel = "General login error" : sBottomLabel = "Contact your information technology department."
Case 3 : sTopLabel = "Unauthorized access" : sBottomLabel = "Contact your information technology department to gain access to this system."
End Select
If iLoginResult > 0 Then
RaiseDialog(sTopLabel, sBottomLabel)
Me.txtPassword.Text = ""
Me.txtUserName.Focus()
Me.txtUserName.SelectAll()
End If
Catch ex As Exception
RaiseError("", "frmLogin.btnOK_Click", Err.Number, Err.Description)
End Try
Me.Cursor = Cursors.Default
If iLoginResult = 0 Then
If Me.cmbEnvironment.Text = "Development" Then modGeneral.gbIsProduction = False
frmMain.Show()
Me.Close()
End If
End Sub
答案 0 :(得分:3)
If iLoginResult = 0 Then
If Me.cmbEnvironment.Text = "Development" Then modGeneral.gbIsProduction = False
frmMain.Show()
Me.Close()
End If
这就是这样做的。您正在从登录表单中打开MainForm(frmMain),因此当您关闭登录表单时,MainForm将被释放,导致程序结束。
您应该做的是从其他启动对象打开您的登录表单和主表单。
进一步说明
所以通过使用Sub Main(ByVal args() As String)
你可以做这样的事情
<STAThread)> _
Public Shared Sub Main(ByVal args() As String)
Using login as New LoginForm
If login.ShowDialog <> DialogResult.OK Then
'End the Application or Whatever if the login isn't valid
End If
End Using
frmMain.Show()
Application.Run()
End Sub
答案 1 :(得分:2)
这是VB.NET中的一个简单修复:Project + Properties,Application选项卡。将关机模式更改为“当最后一个表格关闭时”。
答案 2 :(得分:1)
您是否在Login窗体中创建/实例化主窗体?如果是,那么关闭Login表单也将关闭主表单..这将导致应用程序关闭。
我建议您在主程序中打开登录表单,然后根据响应,在Main例程中实例化主表单并使用它。
我在我的应用程序中使用了类似的东西。
Public Sub Main()
If Not(LoginForm.ValidateUser()) Then
'bail out
Exit Sub
End If
'create the listing form
mainForm = New MainForm
'run it as the application main form
Application.Run(mainForm )
End Sub