メインウィンドウ(mdiコンテナ)のmenuStrip項目テキストを子ウィンドウから変更したいのですが、
このようなもの:
ファイル
- ログイン
に
ファイル
- ログアウト
メイン ウィンドウでこれらを追加します。
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()
。
MDI コンテナーに、その子のいずれかから呼び出し可能なパブリック メソッドを追加できます。
このメソッドが呼び出されたとしましょうSetLoggedStatus
(MDI コンテナー内)
public void SetLoggedStatus(bool status)
{
ToolStripMenuItem loginMenu = MenuStrip1.Items(0) as ToolStripMenuItem:
loginMenu.DropDownItems[0].Text = (status == true ? "Logout" : "Login");
}
ここで、MDI 子フォームからこのパブリック メソッドを呼び出す必要があります。すべての MDIChild フォームには、MDIParent を指すプロパティがあります。そのプロパティを使用して、汎用フォーム インスタンスを正しい MDI 親にキャストできます。
(ログイン後のMDIChildで、MDIParentがMyParentFormという名前のフォームクラスであると仮定)
MyParentForm f = this.MDIParent as MyParentForm;
if(f != null)
f.SetLoggedStatus(true);
これは、MDI 子からメイン メニュー項目にアクセスする方法です。
// 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
。