2010-09-10 4 views
1

J'ai une application VB.NET qui se comporte bizarrement (ou peut-être pas bizarrement du tout et il me manque quelque chose).Émission d'une application VB.NET Fermeture d'un événement sur un formulaire

J'ai un formulaire de connexion que lorsque l'utilisateur clique sur OK et se connecte avec succès, il charge le formulaire de demande principal. Cependant, lorsque je montre le formulaire principal et ferme le formulaire de connexion, l'application déclenche l'événement shutdown. Est-ce parce que l'application pense que le formulaire de connexion est le seul formulaire ouvert et déclenche ainsi l'événement shutdown?

Voici le code pour la routine de connexion, lorsque j'appelle Me.Close() à la fin est lorsque l'événement shutdown est déclenché. Est-ce que je fais des choses dans le désordre? J'avais l'habitude de le faire de cette façon en VB6 sans problèmes (je sais qu'ils sont très différents).

Remarque, ce n'est rien dans frmMain non plus, cela arrive peu importe la forme que j'essaie d'ouvrir.

Merci.

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 

Répondre

3
If iLoginResult = 0 Then 
     If Me.cmbEnvironment.Text = "Development" Then modGeneral.gbIsProduction = False 
     frmMain.Show() 
     Me.Close() 
    End If 

C'est ce qu'on fait. Vous ouvrez le MainForm (frmMain) à partir du formulaire de connexion, ainsi lorsque vous fermez le formulaire de connexion, MainForm est éliminé, provoquant la fin de votre programme.

Ce que vous devez faire est d'ouvrir votre formulaire de connexion et le formulaire principal à partir d'un autre objet de démarrage.

plus Explication

Ainsi, en utilisant Sub Main(ByVal args() As String) vous pouvez faire quelque chose comme ça

<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 
+0

Ou appelez Me.Hide() au lieu de Me.Close() – asawyer

+0

Donc ce que vous spécifiez comme le formulaire de démarrage de la solution est ce qui sera utilisé pour déclencher l'événement shutdown? J'ai des choses d'initialisation dans l'événement de démarrage de l'application, vous dites déplacer ailleurs et faire quelque chose semblable à Sub Main? Désolé, un peu nouveau sur VB.NET. – Tom

+0

@Tom, Oui, vérifiez mes modifications dans un second – msarchet

1

Vous créez/instancier la principale forme dans le formulaire de connexion ??. Si oui, la fermeture du formulaire de connexion va également fermer le formulaire principal, ce qui provoquera la fermeture de l'application.

Je vous suggère d'ouvrir le formulaire de connexion dans le programme principal, puis en fonction de la réponse, instancier le formulaire principal dans la routine principale et l'utiliser.

J'utilise quelque chose comme ça dans mon application.

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 
+0

Oui, voir le commentaire que j'ai fait ci-dessus. – Tom

+0

@Tom +1 Je suis d'accord avec msarchet commentaires et réponses. Vous pouvez également créer un module et placer ce Main() à l'intérieur de celui-ci. Mentionnez simplement l'objet StartUp en tant que Sub Main (l'application doit le détecter et le montrer dans le menu déroulant avec d'autres formulaires, si ce n'est juste faire une build). – SKG

2

Il s'agit d'une simple correction dans VB.NET: Project + Properties, onglet Application. Changez le mode d'arrêt en "Quand le dernier formulaire se ferme".

Questions connexes