3

我需要从子窗口更改主窗口(mdi 容器)的 menuStrip 项文本,

像这样的东西:

文件
-登录

文件
-注销

4

3 回答 3

3

在主窗口中添加这些:

public static MainForm Current;

public string FileLogin
{
    get { return fileLoginToolStripMenuItem.Text; }
    set { fileLoginToolStripMenuItem.Text = value; }
}

显然,使用您为登录/注销菜单项的菜单条项设置或自动设置的名称。然后在主窗体的窗体构造函数中,设置 Current.

public MainForm()
{
    InitializeComponent();
    Current = this;
}

然后从另一个窗口/表单你可以调用(设置值):

MainForm.Current.FileLogin = "Logout";

但比这更好的是你在你的子窗口上做一个事件,

public event Action UserLoggedIn = delegate { };

在 MainForm 上让 MainForm 订阅该事件,与上述相反...

ChildForm.Current.UserLoggedIn += () => FileLogin = "Logout";

并让孩子在用户登录时引发事件,使用UserLoggedIn().

于 2012-06-17T21:56:45.107 回答
2

您可以向您的 MDI 容器添加可从其任何子级调用的公共方法。
假设调用了这个方法SetLoggedStatus

(在 MDI 容器中)

public void SetLoggedStatus(bool status)
{
    ToolStripMenuItem loginMenu = MenuStrip1.Items(0) as ToolStripMenuItem:
    loginMenu.DropDownItems[0].Text = (status == true ? "Logout" : "Login");
}

现在我们需要从 MDI Child 窗体调用这个公共方法。每个 MDIChild 表单都有一个指向 MDIParent 的属性 我们可以使用该属性将通用表单实例转换为正确的 MDI 父级

(在登录后的 MDIChild 中,假设 MDIParent 是一个名为 MyParentForm 的表单类)

MyParentForm f = this.MDIParent as MyParentForm;
if(f != null) 
    f.SetLoggedStatus(true);
于 2012-06-17T22:02:33.520 回答
1

这是您可以从 MDI Child 访问主菜单项的方式:

// this button in the child form
private void button1_Click(object sender, EventArgs e) {  
   ToolStripMenuItem tsm;
   // file menu
   tsm = (ToolStripMenuItem)this.MdiParent.MainMenuStrip.Items[0];
   MessageBox.Show( tsm.DropDownItems[0].Name);
   // first menu under File Menu
   tsm.DropDownItems[0].BackColor = Color.Red;
   // second menu under File Menu
   tsm.DropDownItems[1].BackColor = Color.Wheat;
}

您可以以相同的方式更改字体或文本;您可以使用 . 而不是背景颜色.text

于 2012-09-08T08:49:49.567 回答