【发布时间】:2023-03-30 16:59:01
【问题描述】:
我的第一个表单是登录表单,当用户正确登录时,我会隐藏登录表单并显示第二个表单。现在,我不想隐藏登录表单,而是想从第二个表单中关闭它。我以为我能做到,但不知何故我遇到了麻烦。
到目前为止,我在下面这样做了。
我创建了我的 FrmLogin 实现的接口:
Public Class FrmLogin
Implements ICloseLogin
界面:
Public Interface ICloseLogin
Sub Close()
End Interface
FrmLogin 实现接口:
Private Sub ICloseLogin_Close() Implements ICloseLogin.Close
Me.Close()
End Sub
现在我将 FrmLogin (Me) 传递给第二种形式的构造函数:
Private Sub ShowMainForm()
Dim FrmMain As New FrmMainMDI(Me)
FrmMain.IsMdiContainer = True
FrmMain.StartPosition = FormStartPosition.CenterScreen
FrmMain.Show()
'Me.Hide() 'not anymore
End Sub
第二种形式:
Public Class FrmMainMDI
Private closeloginfform As ICloseLogin
Sub New(frmlogin As ICloseLogin)
' This call is required by the designer.
InitializeComponent()
' Add any initialization after the InitializeComponent() call.
closeloginfform = frmlogin
End Sub
Private Sub FrmMainMDI_Shown(sender As Object, e As EventArgs) Handles MyBase.Shown
closeloginfform.Close()
End Sub
当我调试时,当涉及到行时:closeloginfform.Close() 我想只看到 FrmLogin 被关闭,但一切都以某种方式关闭。为什么?
进一步讨论:
Imports DataAccessLayer
Imports FormsUtils
Imports BusinessLayer
Imports System.Data.SqlClient
Imports System.Configuration
Imports System.Reflection
Imports System.IO
Imports Microsoft.WindowsAPICodePack.Dialogs
Imports Probix
Public Class FrmLogin
Private Property Form As New FormUtils
Private Property DB As New Procs
Private Property _login As String
Private Property _password As String
Private Sub btnLogin_Click(sender As System.Object, e As System.EventArgs) Handles btnLogin.Click
CheckAccess()
End Sub
Private Sub btnClose_Click(sender As System.Object, e As System.EventArgs) Handles btnClose.Click
Me.Close()
End Sub
Private Sub FrmLogin_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
Try
DB.OpenConn()
If DB.conn.State = ConnectionState.Open Then
Call Form.InitCombo(CboLogin, "SELECT * from tbLogin", DB.conn, "Login", "Login")
Call Form.InitCombo(CboLanguage, "SELECT * from tbLanguage where Active = 1", DB.conn, "Language", "Id")
Lang.name = DirectCast([Enum].Parse(GetType(Lang.LangShortcut), CboLanguage.GetItemText(CboLanguage.SelectedItem)), Lang.LangShortcut)
Else
Logger.LogIt(Modules.FrmLogin.ToString & ": " & Methods.FrmLogin_Load.ToString, WriteMsg.Write(IssueCode.SqlServerConnectionError_pl), Application.StartupPath & "\log.txt", False)
Application.Exit()
End If
Catch ex As Exception
Logger.LogIt(ex.tostring)
Application.Exit()
Finally
DB.CloseConn()
End Try
End Sub
Private Sub CheckAccess()
Try
_login = CboLogin.SelectedValue
_password = txtPassword.Text
If Not String.IsNullOrEmpty(txtPassword.Text) And Form.WybranoCombo(CboLogin, "Zaznacz login") Then
Dim strcon = New AppSettingsReader().GetValue("ConnectionString", GetType(System.String)).ToString()
Using con As New SqlConnection(strcon)
Using cmd As New SqlCommand("Select COUNT(*) FROM tbLogin WHERE Login = @Login And Password = @Password", con)
cmd.CommandType = CommandType.Text
cmd.Parameters.AddWithValue("@Login", _login)
cmd.Parameters.AddWithValue("@Password", _password)
con.Open()
Dim o As Integer = cmd.ExecuteScalar()
'--CREDENTIALS OK
If o > 0 Then
CboLogin.Hide()
txtPassword.Hide()
btnLogin.Hide()
Label1.Hide()
Label2.Hide()
Try
Catch ex As Exception
MsgBox(ex.ToString)
End
End Try
'--CREDENTIALS NOT OK !!
Else
MsgBox("Wrong credentials")
End If
End Using
End Using
Else
MsgBox("Write some password !!")
End If
Catch ex As Exception
Logger.LogIt(Modules.FrmLogin.ToString & ":" & Methods.FrmLogin_Load.ToString, WriteMsg.Write(IssueCode.Unknown_pl) & " ------> EX-MESSAGE: " & ex.ToString, Application.StartupPath & " \log.txt", False)
Return
End Try
End Sub
Public Sub taskDialog_Opened(sender As Object, e As EventArgs)
Dim taskDialog As TaskDialog = TryCast(sender, TaskDialog)
taskDialog.Icon = taskDialog.Icon
If Not taskDialog.FooterIcon = TaskDialogStandardIcon.None Then
taskDialog.FooterIcon = taskDialog.FooterIcon
End If
taskDialog.InstructionText = taskDialog.InstructionText
End Sub
End Class
模块程序:
Module Program
Public Sub main()
Application.EnableVisualStyles()
Dim result As DialogResult
Using frmL As New FrmLogin
result = frmL.ShowDialog
End Using
If result = DialogResult.OK Then
Dim FrmMainMDI As New FrmMainMDI()
Application.Run(FrmMain)
End If
End Sub
End Module
进一步讨论 2
已解决???:我在 CheckAccess() 子中添加了一行,这一行:
Me.DialogResult = DialogResult.OK
所以这种代码的和平只被改变了:
...
'--CREDENTIALS OK
If o > 0 Then
CboLogin.Hide()
txtPassword.Hide()
btnLogin.Hide()
Label1.Hide()
Label2.Hide()
Try
'*************************************
Me.DialogResult = DialogResult.OK '<=========================================
'*************************************
Catch ex As Exception
MsgBox(ex.ToString)
End
End Try
'--CREDENTIALS NOT OK !!
Else
MsgBox("Wrong credentials")
End If
...
【问题讨论】:
-
您为什么不将
FrmMainMDI设置为您的启动表单,然后在首次打开或用户未登录时抛出登录提示?我认为你的做法是错误的。 -
首先你能解释一下为什么我的方法不起作用,然后你能解释一下你的意见吗?说实话我不明白。
-
but all is closing somehow如果 FrmLogin 是启动表单,默认设置将在该表单关闭时结束应用程序。将 MDI 表单作为主表单,然后像往常一样显示/丢弃登录表单。或者将您的应用更改为从 Sub Main 开始 -
Plutonix 已经做到了,这将指导您更多(查看最佳答案)stackoverflow.com/questions/16634006/…。按照我建议的方式做会更好。
-
项目 > 属性 > 应用程序选项卡 > 关闭模式,将其更改为“当最后一个表单关闭时”。顺便说一句,通过这些回旋毫无意义,您可以在调用 Show() 方法后简单地使用
Me.Close()。
标签: vb.net