質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

Q&A

解決済

1回答

4421閲覧

継承したフォームのメニューストリップの変更

退会済みユーザー

退会済みユーザー

総合スコア0

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

0グッド

0クリップ

投稿2020/01/18 16:19

編集2020/01/19 08:44

前提・実現したいこと

継承したフォームのコントロールを派生フォームで独自に変更したいのですが
(継承したコントロールを派生フォームのみで変更し、基底フォームの当該コントロールには影響させないようにしたいと思います。)、
ボタンコントロールではそれができたのですが、メニューストリップではそれができませんでした。
ご教示お願いします。

試したこと

こちらのサイトを参考にしました。

基底フォームのデザインで、ボタンコントロールのModifiresプロパティをPublicに設定し、
派生フォームのデザインで、ボタンの位置や、ボタンの各プロパティを変更することはできました。

しかし、同様の操作をメニューストリップで行ったところ、
(基底フォームのデザインで、メニューストリップのModifiresプロパティをPublicに設定してみた所)、
派生フォームで、メニューストリップにメニュー項目の追加などができませんでした。
メニューストリップのプロパティも変更不可状態です。
ModifiresプロパティをPublicに変更した際、ビルドは実行しました。
ご教示お願いします。

補足情報(FW/ツールのバージョンなど)

Visual Studio 2019
Visual C#

追記

C#

1using System; 2using System.Collections.Generic; 3using System.Linq; 4using System.Text; 5using System.Threading.Tasks; 6using System.Windows.Forms.Design; 7using System.Windows.Forms; 8 9namespace SampleWindowsFormsApp1 10{ 11 [System.ComponentModel.Designer(typeof(System.Windows.Forms.Design.ControlDesigner))] 12 class MyMenuStrip : MenuStrip 13 { 14 public MyMenuStrip() 15 { 16 InitializeComponent(); 17 } 18 } 19}

追記②

選択中のフォントサイズには、チェックマークが付く仕様にしたいと思っています。
イメージ説明

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

MenuStripやToolStrip、FlowLayoutPanelなどでこのような現象が起こるようです。

解決策としてはこのような方法があるようです。
C# 継承先フォームから基本フォームに配置したToolStripにアクセスできない
ただ、追加するアイテム等も同様の現象が起こるため、追加するアイテムも継承する必要があるなど一筋縄ではいかないようです。

上記のようにMenuStripを継承したコントロールを作成するか、
デザイナを使わずにコード上から追加したい項目を追加するのが解決法となると思います。
お勧めとしては、コード上から追加する方法ですね

投稿2020/01/19 01:09

YAmaGNZ

総合スコア10258

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2020/01/19 05:05

ご回答ありがとうございます。 特有の現象があるのですね。 コードで書くことを推奨とご教示いただいのですが、ご提示のリンクの方法も気になってしまい、 実装を試したのですが、 [System.ComponentModel.Designer(typeof(System.Windows.Forms.Design.ControlDesigner))] の箇所で、ControlDesignerがエラー表示になってしまうのですが、どのようにすれば解決できますか? 「using System.Windows.Forms.Design;」等を書いてみたのですが、エラーが消えないという状態です。 試しているコードは、質問の追記箇所に掲載いたしました。
YAmaGNZ

2020/01/19 05:21

リンクしたページに「DesignerType は、System.Design.dll を参照設定に追加する必要がある。」と書いてあります。
退会済みユーザー

退会済みユーザー

2020/01/19 05:48

ご回答ありがとうございます。 プロジェクトメニュー → 参照の追加 → 参照でSystem.Design.dllを探したのですが、なかったので、これは標準では用意されていないということですか? どこかネットから検索してダウンロードしなければならないものでしょうか?
kenshirou

2020/01/19 05:56

参照マネージャーでフレームワークのアセンブリより「System.Design」を選択します。
YAmaGNZ

2020/01/19 05:57

フレームワーク内にSystem.Designがあるはずです。 ただ、MenuStripを継承したものを作成する場合、 単純に [System.ComponentModel.Designer(typeof(System.Windows.Forms.Design.ControlDesigner))] public class MyMenuStrip : MenuStrip { } とDesign属性をつけるだけではなく ToolStripMenuItemも継承したものを作らないとダメですし、MyMenuStripのほうで作成したToolStripMenuItemをデザイナで追加できるように作らないとダメですし、かなり大変かと思います。
退会済みユーザー

退会済みユーザー

2020/01/19 08:44

ご回答ありがとうございます。 参照マネージャーのアセンブリのフレームワークで、「System.Design」があることが確認できました。 なるほど、ToolStripMenuItemも継承したり、デザイナで追加する作業も必要なのですね。 別トピックを立てて、質問しようか迷っていたのですが、関連性があるので質問させていただけませんか? 複数フォームを作成する際、質問の追記②の画像のような、テキストボックスのフォントサイズを変更するメニューを、 共通して持たせて、なおかつ、各フォームごとに他のメニュー項目が独自にあるといった実装をしたい場合、どのような設計が効率的でしょうか? 今回の質問で、継承してメニューストリップをカスタマイズするのはかなり大変ということは理解できました。 やはり、コードからメニュー項目を追加する実装がよいですか?
YAmaGNZ

2020/01/19 11:24

どういう形での共通化なのか分かりませんが、基底フォームで普通にMenuStripを使って共通部分をデザイナーで作成し、継承フォーム側で独自のメニューをソースコード上から追加する等してはどうですか?
退会済みユーザー

退会済みユーザー

2020/01/19 11:28

ご回答ありがとうございます。 追記②の説明がわかりづらくてすみません。 やはり、独自メニューは、ソースコード上から追加するのがよいのですね。 勉強になりました。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問