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