Winforms - MDI 父级 refresh/re-activate
Winforms - MDI Parent refresh/re-activate
我有一个 MDI 父窗体,其中有一个应用程序的菜单条。我的应用程序启动文件是 MDI 父窗体,它在加载时调用子登录窗体。代码如下:
Dim myForm As Form = New Login
Dim formResult As DialogResult = myForm.ShowDialog()
If formResult = Windows.Forms.DialogResult.OK Then
If LoginSucceeded = True Then
Me.tabMainMenu.Visible = True
ApplyUserAccess(eApp.DataAccess.DAL_UserSettings.SelectMenuSettingByUserID(glbUserID))
myForm.Dispose()
End If
End If
菜单条有一个注销标签,单击该标签将禁用菜单条并再次显示登录表单。
布尔字段 LoginSucceeded 确定用户凭证的成功验证,并根据授予该用户的访问权限设置菜单。我的问题是第一次根据用户的访问正确设置 MDI 父级上的主菜单。注销并再次登录后,我想再次相应地设置主菜单,但没有发生。
MDI Parent 上的 Form_Load 事件仅执行一次。
关于 MDI 父级在第二次获得焦点时重新绘制的任何提示。
谢谢,
ZK
我的注销代码如下:
Dim blnLogout As DialogResult = MessageBox.Show("Are You Sure You Want To Logout?", "eApp", MessageBoxButtons.YesNo, MessageBoxIcon.Question)
If blnLogout = Windows.Forms.DialogResult.Yes Then
SetToolbarMenuStyle()
tabMainMenu.Visible = False
LoginSucceeded = False
blnShowLoginTab = True
Dim myForm As Form = New Login
myForm.MdiParent = Me
myForm.WindowState = FormWindowState.Normal
myForm.Show()
End If
这是对您的代码的推测,我猜您在 Form.Load 事件中添加了有关代码。 Form.Load
事件仅在表单首次显示时引发。
根据 MSDN
Form.Load 事件
Occurs before a form is displayed for the first time.
现在,当您注销时,您会将表单的 visibility
设置为 false。所以我建议您将代码从 Form.Load
事件移动到 Form.VisibleChanged
事件。
根据 MSDN
Form.Load 事件
Occurs when the Visible property value changes.
将您的登录代码移到主窗体中它自己的方法中,以便您可以多次调用它:
Public Class Form1
Private Sub Form1_Shown(sender As Object, e As EventArgs) Handles Me.Shown ValidateLogin()
ValidateLogin()
End Sub
Private Sub LoginLogoutToolStripMenuItem_Click(sender As Object, e As EventArgs) Handles LoginLogoutToolStripMenuItem.Click
ValidateLogin()
End Sub
Private Sub ValidateLogin()
' disable appropriate main form elements so they can't access anything:
Me.tabMainMenu.Visible = False
Using myForm As New Login
If myForm.ShowDialog(Me) = Windows.Forms.DialogResult.OK Then
' login succeeded: re-enable main form elements
Me.tabMainMenu.Visible = True
ApplyUserAccess(eApp.DataAccess.DAL_UserSettings.SelectMenuSettingByUserID(glbUserID))
Else
MessageBox.Show("Login Failed")
End If
End Using
End Sub
End Class
您也不需要 "LoginSucceeded" 变量。您可以通过在登录表单中将 DialogResult 设置为 OK 将 success/failure 传回主表单:
Public Class Login
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
If True Then ' <-- perform your check
Me.DialogResult = Windows.Forms.DialogResult.OK ' only return OK if login has succeeded
End If
End Sub
End Class
我有一个 MDI 父窗体,其中有一个应用程序的菜单条。我的应用程序启动文件是 MDI 父窗体,它在加载时调用子登录窗体。代码如下:
Dim myForm As Form = New Login
Dim formResult As DialogResult = myForm.ShowDialog()
If formResult = Windows.Forms.DialogResult.OK Then
If LoginSucceeded = True Then
Me.tabMainMenu.Visible = True
ApplyUserAccess(eApp.DataAccess.DAL_UserSettings.SelectMenuSettingByUserID(glbUserID))
myForm.Dispose()
End If
End If
菜单条有一个注销标签,单击该标签将禁用菜单条并再次显示登录表单。 布尔字段 LoginSucceeded 确定用户凭证的成功验证,并根据授予该用户的访问权限设置菜单。我的问题是第一次根据用户的访问正确设置 MDI 父级上的主菜单。注销并再次登录后,我想再次相应地设置主菜单,但没有发生。
MDI Parent 上的 Form_Load 事件仅执行一次。
关于 MDI 父级在第二次获得焦点时重新绘制的任何提示。
谢谢, ZK
我的注销代码如下:
Dim blnLogout As DialogResult = MessageBox.Show("Are You Sure You Want To Logout?", "eApp", MessageBoxButtons.YesNo, MessageBoxIcon.Question)
If blnLogout = Windows.Forms.DialogResult.Yes Then
SetToolbarMenuStyle()
tabMainMenu.Visible = False
LoginSucceeded = False
blnShowLoginTab = True
Dim myForm As Form = New Login
myForm.MdiParent = Me
myForm.WindowState = FormWindowState.Normal
myForm.Show()
End If
这是对您的代码的推测,我猜您在 Form.Load 事件中添加了有关代码。 Form.Load
事件仅在表单首次显示时引发。
根据 MSDN Form.Load 事件
Occurs before a form is displayed for the first time.
现在,当您注销时,您会将表单的 visibility
设置为 false。所以我建议您将代码从 Form.Load
事件移动到 Form.VisibleChanged
事件。
根据 MSDN Form.Load 事件
Occurs when the Visible property value changes.
将您的登录代码移到主窗体中它自己的方法中,以便您可以多次调用它:
Public Class Form1
Private Sub Form1_Shown(sender As Object, e As EventArgs) Handles Me.Shown ValidateLogin()
ValidateLogin()
End Sub
Private Sub LoginLogoutToolStripMenuItem_Click(sender As Object, e As EventArgs) Handles LoginLogoutToolStripMenuItem.Click
ValidateLogin()
End Sub
Private Sub ValidateLogin()
' disable appropriate main form elements so they can't access anything:
Me.tabMainMenu.Visible = False
Using myForm As New Login
If myForm.ShowDialog(Me) = Windows.Forms.DialogResult.OK Then
' login succeeded: re-enable main form elements
Me.tabMainMenu.Visible = True
ApplyUserAccess(eApp.DataAccess.DAL_UserSettings.SelectMenuSettingByUserID(glbUserID))
Else
MessageBox.Show("Login Failed")
End If
End Using
End Sub
End Class
您也不需要 "LoginSucceeded" 变量。您可以通过在登录表单中将 DialogResult 设置为 OK 将 success/failure 传回主表单:
Public Class Login
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
If True Then ' <-- perform your check
Me.DialogResult = Windows.Forms.DialogResult.OK ' only return OK if login has succeeded
End If
End Sub
End Class