高見知英のかいはつにっし(β)

高見知英のアプリケーション開発日誌 のほか、地域活動などの活動報告ブログ。

メニューのマージ

C#でMDIフォームを使っていて、子フォームのメニューを親フォームにマージする場合のメモ。
基本的には方法 : MDI ドロップダウン メニューに MenuStrip を挿入する (Windows フォーム)を参考にすればできます。親フォームのマージしたいトップレベルメニュー項目と、子フォームに置くメニューのトップレベルメニュー項目名を同じにすればいいようですね*1。そして、子フォームのメニュー項目内のメニューアイテムのMergeIndexを、メニュー項目を挿入したいインデックスに合わせます(わかりにくい場合は下の例示参照)。
ただし、そのままだと子メニューの"ファイル"というトップレベルメニューのみが残って表示されてしまうので、このメニュー項目のVisibleをFalseに設定、(子フォームでDockを使ってフォーム部品をレイアウトしている場合に限り、)子フォームのMenuStripのDockをNoneに設定してあげればいいです。他に方法がありそうな気もしますが…、まあ、とりあえずこれでうまくいきましたので、これにて。

以下例示。

フォーム1

フォーム1(親フォーム)が以下のようになっている場合

  • ファイル
    • アップロード
    • -
    • メニューを追加したい場所
    • サイトの作成
    • サイトの削除
    • -
    • 終了
  • ・・・
フォーム2

フォーム2(子フォーム)には、以下のメニューを追加します

  • ファイル(MergeIndex=-1, MergeAction=MatchOnly)
    • 保存(MergeIndex=2, MergeAction=Insert)
    • 保存して閉じる(MergeIndex=3, MergeAction=Insert)
    • 保存せずに閉じる(MergeIndex=4, MergeAction=Insert)

MergeIndexで指定したとおり、親メニューの上から2番目に挿入された と考えればいいみたいですね。

*1:おそらく、例のとおりMergeActionがMatchOnlyの場合