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

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

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

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

Q&A

解決済

2回答

909閲覧

ContextMenuStripで、第一階層のすべての項目に同じDropDownItemsをつけたい[C#]

yuyu__

総合スコア26

C#

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

0グッド

0クリップ

投稿2018/09/01 19:59

編集2018/09/04 10:25

前提・実現したいこと

button1を押すと、ContextMenuが表示されるプログラムのメソッドです。
想定結果の通りになりません。ご教授願います。

---想定結果
以下のソースコードを例にし、「aaa」と「bbb」のメニューの両方にDropDownItems「ccc」が表示される。

---今の結果
以下のソースコードを例にし、「bbb」のメニューからしか、DropDownItems「ccc」が表示されない。

該当のソースコード

public void ShowMenu() { ToolStripMenuItem item = new ToolStripMenuItem("ccc"); ToolStripMenuItem item2 = new ToolStripMenuItem("aaa"); item2.DropDownItems.Add(item); ToolStripMenuItem item3 = new ToolStripMenuItem("bbb"); item3.DropDownItems.Add(item); ContextMenuStrip c = new ContextMenuStrip(); c.Items.Add(item2); c.Items.Add(item3); c.Show(button1, c.Left, c.Bottom); }

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2018/09/01 21:40

何を作っているかと(Windows Froms? WPF? その他?) と開発環境(OS, .NET, VS のバージョンなど) ぐらいは書けませんか?
yuyu__

2018/09/02 07:19

ご指摘の件、Formにボタンがあって押すとContextMenuを表示するプログラムです。OSはWindows10 64bit、.NET4.7、VS2017です。
yuyu__

2018/09/02 07:26

なので、Windows Formですね。
退会済みユーザー

退会済みユーザー

2018/09/02 07:59

それを書くようにしましょう。ContextMenuStrip を調べれば Windows Forms かも知れないとは分かるかもしれませんが、あなたが質問の最初の書いてくれれば回答者・閲覧者は調べる手間が省けます。あと、開発環境も重要です。特に .NET のバージョン。それによって話が変わってくることは多々あります。
yuyu__

2018/09/02 16:37

確かにそうですね。教えていただきありがとうございます。
guest

回答2

0

子のアイテムから見て、親項目を2つ持つことはできません。
ですので、別のアイテムとして作成し、イベントハンドラを共通させるというやり方になります。

C#

1ToolStripMenuItem item1 = new ToolStripMenuItem("aaa"); 2ToolStripMenuItem item2 = new ToolStripMenuItem("bbb"); 3 4ToolStripMenuItem item_c1 = new ToolStripMenuItem("ccc"); 5item_c1.Click += new System.EventHandler(C1_ToolStripMenuItem_Click); 6ToolStripMenuItem item_c2 = new ToolStripMenuItem("ccc"); 7item_c2.Click += new System.EventHandler(C1_ToolStripMenuItem_Click); 8 9item1.DropDownItems.Add(item_c1); 10item2.DropDownItems.Add(item_c2); 11 12ContextMenuStrip c = new ContextMenuStrip(); 13c.Items.Add(item1); 14c.Items.Add(item2); 15 16 17c.Show(button1, c.Left, c.Bottom);

という感じで子のイベントハンドラに同じものを設定してやればいいかと

投稿2018/09/01 22:32

編集2018/09/02 15:52
YAmaGNZ

総合スコア10258

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

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

yuyu__

2018/09/02 13:58

ご回答ありがとうございます。良ければ、どのコントロールのなんのイベントを使うか教えてください。
yuyu__

2018/09/05 14:41

理解しました。ありがとうございます。
guest

0

ベストアンサー

どうしても一つのitemを使いまわしたい、というのであれば、
それぞれのContextMenuStripのOpeningイベントでItemを登録すればいいかと

投稿2018/09/01 23:58

y_waiwai

総合スコア87774

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

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

yuyu__

2018/09/02 16:24

public void Menu_Opening(object sender, CancelEventArgs e) { ContextMenuStrip c = sender as ContextMenuStrip; c.Items.Clear(); c.Items.Add(toolStripMenuItem1); } と、上記のようにし、最後に第2階層目で表示したいItemをAddしました。ただこれではカーソルが第1階層のメニューを離れると、DropDownMenuがなくなり横▲ボタンが消えてしまいます。そのようにならないためにはどうすればいいんでしょうか。。。
y_waiwai

2018/09/02 22:50

こちらで試してみてもそうはならないですが、なにか別の所でなんかやってないですか
yuyu__

2018/09/04 15:31

ToolStripMenuItem t = new ToolStripMenuItem("aaa"); //第2階層目のもの ToolStripMenuItem t2 = new ToolStripMenuItem("bbb");  //第1階層目のもの ToolStripMenuItem t3 = new ToolStripMenuItem("ccc");  //第1階層目のもの ContextMenuStrip c = new ContextMenuStrip(); //第1階層目のもの ContextMenuStrip c2 = new ContextMenuStrip(); //第2階層目のもの ContextMenuStrip c3 = new ContextMenuStrip(); //第2階層目のもの public Form1() { InitializeComponent(); c.Items.Add(t2); c.Items.Add(t3); c2.Opening += new CancelEventHandler(Menu_Opening); c3.Opening += new CancelEventHandler(Menu_Opening); t2.DropDown = c2; t3.DropDown = c3; }
yuyu__

2018/09/04 15:34

フォームのコンストラクタはこのようになっています。あと、なぜか第2階層目のContextMenuStripのOpeningメソッドが走るたびに、第2階層目のアイテムが0個になります。全然原因がわかりませんでした。m(__)m
y_waiwai

2018/09/04 22:34

イベントの使い方が間違ってますね
yuyu__

2018/09/05 14:45

ご回答ありがとうございます。間違いがよく分かっていないので、もし時間がありましたら書いて下さるとうれしいです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問