如何禁用 MDI 子项的条带菜单项
本文关键字:菜单项 何禁用 MDI | 更新日期: 2023-09-27 18:35:41
我有一个父窗体,其中包含一个名为 topMenu
的条带菜单。
我有一个名为"登录"的子表单,当用户登录时,我想禁用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();
}
}
我宁愿父窗体从子窗体获取所需的数据,而不是子窗体对父窗体了解太多并修改其上的控件。
向登录表单添加一个属性,该属性返回用户是否已通过身份验证。(如果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 和停靠等等,但这应该适用于您现有的代码。