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