Winforms - MDI父级刷新/重新激活

时间:2015-01-28 05:57:19

标签: vb.net winforms mdi

我有一个MDI Parent表单,其中包含应用程序的menustrip。我的应用程序启动文件是MDI Parent表单,在加载时调用子登录表单。代码如下:

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

menustrip有一个Logout标签,单击该标签会禁用菜单条并再次显示登录表单。 布尔字段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

2 个答案:

答案 0 :(得分:0)

以下是对您的代码的假设,我猜你在Form.Load事件中添加了有关代码的内容。只有在第一次显示表单时才会引发Form.Load事件。

根据MSDN Form.Load活动

  

在首次显示表单之前发生。

现在,当您注销时,您将表单的visibility设置为false。因此,我建议您将代码从Form.Load事件移至Form.VisibleChanged事件。

根据MSDN Form.Load活动

  

当Visible属性值更改时发生。

答案 1 :(得分:0)

将您的登录代码移动到主窗体中自己的方法,以便多次调用它:

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来将成功/失败传递回主表单:

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