0

我有一个带有条形菜单的父表单,名为topMenu.

我有一个名为“SignIn”的子表单,当用户登录时,我想禁用topMenu.item.logIn并启用topMenu.item.Logout.

如何topMenu从子窗体中禁用父容器?

当用户单击条形菜单项“登录”时,将执行以下代码。

private void signInToolStripMenuItem_Click(object sender, EventArgs e)
{
    var newMDIChild = new SignIn();

    // Set the Parent Form of the Child window.
    newMDIChild.MdiParent = this;

    newMDIChild.Dock = DockStyle.Fill;
    // Display the new form.
    newMDIChild.Show();

}

在用户输入用户名和密码后,执行以下代码

public partial class SignIn : Form
{
    public SignIn()
    {
        InitializeComponent();
    }

    private void btn_signin_Click(object sender, EventArgs e)
    {
        UserInfo.Autherized = true;

        // here I want to disable the sign in menu item
        // and enable the sign out menu item which is located on the parent form
        this.Close();
    }
}
4

1 回答 1

2

我更希望父表单从子表单中获取所需的数据,而不是子表单对父表单了解太多并修改其上的控件。

向您的登录表单添加一个属性,该属性返回用户是否已通过身份验证。(如果 UserInfo 是公开的并且可以从登录表单外部引用,那么只需使用它并跳过此步骤。)

public bool IsUserAuthenticated
{
    get { return UserInfo.Autherized; }
}

然后读取该值并在登录表单关闭时采取适当的操作。(这订阅了登录表单关闭时执行的事件,并告诉它运行一些代码。)

private void signInToolStripMenuItem_Click(object sender, EventArgs e)
{
    var si = new SignIn();
    si.MdiParent = this;
    si.Dock = DockStyle.Fill;
    si.FormClosed += delegate
                     {
                         if (si.IsUserAuthenticated)
                         {
                             yourLoginItem.Enabled = false;
                             yourLogoutItem.Enabled = true;
                         };
                     }
    si.Show();
}

有更简单的方法可以做到这一点,比如只实例化一个新的登录表单并使用ShowDialog()而不是设置一个 MdiParent 和停靠等等,但这应该适用于您现有的代码。

于 2014-12-30T03:36:09.613 回答