Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
VB.NET应用程序在窗体关闭时触发关闭事件_Vb.net - Fatal编程技术网

VB.NET应用程序在窗体关闭时触发关闭事件

VB.NET应用程序在窗体关闭时触发关闭事件,vb.net,Vb.net,我有一个VB.NET应用程序,它的行为很奇怪,或者根本不奇怪,我只是错过了一些东西 我有一个登录表单,当用户单击OK并成功登录时,它将加载主申请表单 但是,当我显示主窗体并关闭登录窗体时,应用程序正在触发关闭事件 这是因为应用程序认为登录表单是唯一打开的表单,因此引发关闭事件吗 这是我调用我时登录例程的代码。最后关闭是在启动关机事件时。我做的事情有秩序吗?我曾经在VB6中这样做,没有任何问题,我知道它们有很大的不同 请注意,这在frmMain中也不存在,无论我尝试打开哪个表单,都会发生这种情况

我有一个VB.NET应用程序,它的行为很奇怪,或者根本不奇怪,我只是错过了一些东西

我有一个登录表单,当用户单击OK并成功登录时,它将加载主申请表单

但是,当我显示主窗体并关闭登录窗体时,应用程序正在触发关闭事件

这是因为应用程序认为登录表单是唯一打开的表单,因此引发关闭事件吗

这是我调用我时登录例程的代码。最后关闭是在启动关机事件时。我做的事情有秩序吗?我曾经在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
这就是我们要做的。您正在从登录表单打开MainForm frmMain,因此当您关闭登录表单时,MainForm将被释放,导致程序结束

您应该做的是从其他启动对象打开登录表单和主表单

进一步解释

因此,通过使用Sub MainByVal args作为字符串,您可以执行如下操作

<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
这就是我们要做的。您正在从登录表单打开MainForm frmMain,因此当您关闭登录表单时,MainForm将被释放,导致程序结束

您应该做的是从其他启动对象打开登录表单和主表单

进一步解释

因此,通过使用Sub MainByVal args作为字符串,您可以执行如下操作

<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

您是否正在登录表单中创建/实例化主表单??。如果是,那么关闭登录表单也将关闭主表单。这将导致应用程序关闭

我建议您在主程序中打开登录表单,然后根据响应,在主例程中实例化主表单并使用它

我在我的应用程序中使用类似的东西

 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

您是否正在登录表单中创建/实例化主表单??。如果是,那么关闭登录表单也将关闭主表单。这将导致应用程序关闭

我建议您在主程序中打开登录表单,然后根据响应,在主例程中实例化主表单并使用它

我在我的应用程序中使用类似的东西

 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

这是VB.NET中的一个简单修复:项目+属性,应用程序选项卡。将关闭模式更改为最后一个窗体关闭时。

这是VB.NET中的一个简单修复程序:项目+属性,应用程序选项卡。将关闭模式更改为最后一个窗体关闭时。

或调用我。隐藏而不是我。关闭。那么,无论您指定什么作为解决方案的启动窗体,都将用于触发关闭事件?我在应用程序启动事件中有初始化内容,你是说把它移到其他地方,做一些类似Sub-Main的事情?对不起,对VB.NET来说有点陌生。VB.NET中的Sub-Main在哪里?我可以从sub main而不是app startup中初始化所有变量,然后从sub main打开登录表单并从那里获取它吗?是的,这就是我要做的,我将sub main放在一个我称为ProgramStartup的类中。@Tom为了清晰易读,我建议不要使用它。其他程序员可能想知道应用程序是如何关闭的,而在主要方法中,几乎任何人都可以遵循逻辑。或者叫我.Hide而不是我.close。那么,无论您指定什么作为解决方案的启动形式,都将用于触发关闭事件?我在应用程序启动事件中有初始化内容,你是说把它移到其他地方,做一些类似Sub-Main的事情?对不起,对VB.NET来说有点陌生。VB.NET中的Sub-Main在哪里?我可以从sub main而不是app startup中初始化所有变量,然后从sub main打开登录表单并从那里获取它吗?是的,这就是我要做的,我将sub main放在一个我称为ProgramStartup的类中。@Tom为了清晰易读,我建议不要使用它。其他程序员可能想知道应用程序是如何关闭的,而在主要方法中,几乎任何人都可以遵循逻辑。是的,请参阅我上面的评论。@Tom+1我同意msarchet的评论和答案。您还可以创建一个模块,并将此干管放置在其中。只要提到启动对象,因为Sub-Main应用程序应该检测到它,并将其与其他表单一起显示在下拉列表中,如果不只是进行构建的话。是的,请参阅我上面的注释。@Tom+1我同意msarchet注释和答案。您还可以创建一个模块,并将此干管放置在其中。只要提到启动对象,Sub-Main应用程序就会检测到它,并在下拉列表中与其他表单一起显示,如果不只是进行构建的话。