VB.NET应用程序在表单关闭时触发Shutdown事件

时间:2010-09-10 17:43:13

标签: vb.net

我有一个行为奇怪的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

3 个答案:

答案 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