ToolStripMenuItemの選択方法について

このQ&Aのポイント
  • ToolStripMenuItemを動的に追加する方法について説明します。
  • 2階層まではToolStripMenuItem.DropDownItemClickedイベントで取得できますが、それより深い階層に追加されたアイテムのクリックは判別できません。
  • ContextMenuStripのClosingイベントで選択したノードを辿ることも考えられますが、selectedプロパティでは最上階層までしか判別できません。どのように解決すれば良いでしょうか。
回答を見る
  • ベストアンサー

ToolStripMenuItemの選択(VB)

フォーム上に、デザイン時に作成されたContextMenuStripに対して、 プログラム内で動的にそのメニューアイテム(ToolStripMenuItem)を追加します。 これが2階層までは、「ToolStripMenuItem.DropDownItemClicked」というイベントで取得できますが、 それより深い階層に動的に追加されたアイテムに対してのクリック(選択)が判別できません。 ContextMenuStripに、深い階層で動的に追加されたToolStripMenuItemのクリックを取得するには、 どうしたらよいでしょうか。 大元の、ContextMenuStripのClosingイベントで、大元から1つずつ選択されたノードを辿っていこうと考えましたが、selectedプロパティでは、最上階層までしか判別できません。 分かる方、教えて下さい。お願いします。

  • mshs
  • お礼率76% (29/38)

質問者が選んだベストアンサー

  • ベストアンサー
  • MARU4812
  • ベストアンサー率43% (196/452)
回答No.1

動的に作った時に、ToolStripMenuItem.Click イベントを AddHandler で関数に結び付けといてあげればいいのでは?

mshs
質問者

お礼

AddHandler 初めて使いました! こんな便利なのがあったんですね! これで全て解決です。 本当にありがとうございました。

関連するQ&A

  • コンテキストメニュークリック時のイベントハンドラ

    C#にてフォームアプリを作成しています。 そこでツリービューに表示されたノードを右クリックしたときにコンテキストメニューが表示される ように下記のように記述しました。表示されたノードの上で右クリックすると「Export」、「Import」 というメニューが表示されます。 しかし、イベントハンドラの書き方がよくわかりません。 「Export」又は「Import」がクリックされたというイベントはどう検出すればよいでしょうか。 // ノード右クリック時の動作 private void treeView1_MouseDown(object sender, MouseEventArgs e) { // 右クリックでもノードを選択させる if (e.Button == MouseButtons.Right) { // ノードの選択 treeView1.SelectedNode = treeView1.GetNodeAt(e.X, e.Y); // コンテクストメニューの作成 ContextMenuStrip contextMenu = new ContextMenuStrip(); ToolStripMenuItem openLabel = new ToolStripMenuItem(); openLabel.Text = "Export"; ToolStripMenuItem deleteLabel = new ToolStripMenuItem(); deleteLabel.Text = "Import"; contextMenu.Items.Add(openLabel); contextMenu.Items.Add(deleteLabel); // ツリービューにコンテキストメニューを追加 treeView1.ContextMenuStrip = contextMenu; } }

  • C# 2010 contextMenuStripのファンクション名の不

    C# 2010 contextMenuStripのファンクション名の不思議? まず2ケのメニューアイテムを持つcontextMenuStripを作り、それぞれのTEXTを試験1、試験3と改名します ダブルクリックするとハンドラーが出来て、その名称が(1)(2)のように TEXT名+ToolStripMenuItem_Click なります ここでいったんプロジェクトを終了して再ロードします 画像のように試験1と試験3の間に『試験3を途中に追加』を入れてダブルクリックして作ったファンクション名は前2者とは異なり (3)の如くtoolStripMenuItem1_Click となってしまいます なぜ 試験2を途中に追加ToolStripMenuItem_Click にならないのでしょうか? private void 試験1ToolStripMenuItem_Click(object sender, EventArgs e) --- (1) { } private void 試験3ToolStripMenuItem_Click(object sender, EventArgs e) --- (2) { } private void toolStripMenuItem1_Click(object sender, EventArgs e) --- (3) { } 追伸 『試験3を途中に追加』が長すぎるかと思い、『試験3』だけにしても結果は同じでした

  • ToolStripMenuItemのクリックイベントからTreeViewのノードを取得したい

    C#3.5を使用しています。 TreeViewのContestMenuStripのToolStripMenuItemをクリックしたときに どの(複数のノードに同じContestMenuStripをセットしています)TreeViewのノードからのToolStripMenuItemが クリックされたかを知るためにEventArgs e からTreeViewの選択されてるノードが取得したいのですが、 どうすれば良いのでしょうか? private void itemAddToolStripMenuItem_Click(object sender, EventArgs e) { var ev = (System.Windows.Forms.ToolStripItemEventArgs)e;// ToolStripItemEventArgsにキャストすればよいかと思ったのですがエラーになります・・・ }

  • VS C# のコンテキストの動作について

    VS C# のコンテキストの動作がうまくいきません、助けてください>< List Viewのアイテムを右クリックしたときに「アイテム名を表示させる」というコンテキストを表示し、それをクリックするとアイテム名を表示させるというプログラムを組んだのですが、一度目はうまく動作するのですが、その後、List Viewのアイテムのない場所を右クリックしてもコンテキストが表示されてしまいます。 何が原因なんでしょうか? 教えてください、お願いします。 以下コード 前略 private void ListView_MouseClick(object sender, MouseEventArgs e) { if (e.Button == MouseButtons.Right) { ConTextMenu(); } } private void ConTextMenu() { ContextMenuStrip cms = new ContextMenuStrip(); ToolStripMenuItem menu1 = new ToolStripMenuItem(); menu1.Text = "アイテム名を表示させる"; cms.Items.AddRange(new ToolStripMenuItem[] { menu1} ); menu1.Click += new EventHandler(menu_Click); this.ContextMenuStrip = cms; } private void menu_Click(object sender, EventArgs e) { string msg = sender.ToString(); if (msg == "アイテム名を表示させる") { ListViewItem item1 = new ListViewItem(); item1 = songlist.SelectedItems[0]; iname = item1.SubItems[0].Text; MessageBox.show(iname.Tostring()); }

  • TreeViewコントロールについて

    VB2005環境です。 TreeViewコントロールを作成し、ノードごとにクリックイベントを 追加して、タブコントロールを呼び出すようにしたいと考えています。 (親ノードをクリックしたら、親ノード用のタブコントロールが 画面に表示され、さらに子ノードAをクリックすると、ノードA用の タブコントロールが表示される、ノードBをクリックすると…という具合に)。 NodeMouseClickイベントを使えば良いのかとは思うのですが、クリックイベントが 子ノード各々ごとに取得できず困っています。 やり方を教えていただけないでしょうか? 更に、そこから各々専用のタブコントロールを呼び出す方法も 教えていただけるとありがたいです。 よろしくお願いします。

  • jtreeのノードを右クリックで選択する方法

    JTreeを使ってノードを複数作成し、ノードごとに文字列を入れる。 右クリックを押すとポップアップメニューが表示され、"表示"というメニューアイテムだけ表示される。 メニューアイテムの"表示"を押すとjtreeの下に用意されたjlabelにノードに入れられている文字列が表示される。 といったプログラムを作成しているのですが現在ノードの選択は左クリックでしか行う事ができません。 各ノードの上で右クリックで押すとノードの選択とポップアップの表示を同時に行えるようにしたいのですが どのようにすれば実現できるのかわかりません。 よろしければどなたかご教授お願いします。

    • ベストアンサー
    • Java
  • C♯ 画面の排他制御法?

    C♯ NortifyIconとcontextMenuStripによる画面排他制御に関する質問です メインのフォームForm1にNortifyIconを貼り付け、そこにcontextMenuStripを繋ぎました contextMenuStripでは10ケのサブフォームForm10~19を選択し表示します Form10~19は互いに排他関係にありますので、Form10~19が選択された時にNortifyIconからcontextMenuStripを切り離します これでForm10~19が同時に表示されることはありません Form10~19が終了する時に再びNortifyIconとcontextMenuStripを結び付け、NortifyIconのクリックでcontextMenuStripを表示しForm10~19の選択を可能ならしめています ところがNortifyIconをクリックしcontextMenuStripが表示された段階で全く別な所(contextMenuStrip以外のデスクトップなど)をクリックするととcontextMenuStripは消去されます この状態ですとNortifyIconとcontextMenuStripは切り離されたままですので、これ以降Form10~19を選択することが出来ません 対策としてcontextMenuStripがクローズした時点でNortifyIconとcontextMenuStripを結び附けましたら、今度はForm10~19が選択された段階でcontextMenuStripが消えますので、NortifyIconをクリックするとForm10~19が選択可能になってしまいます ⇒ Form10~19の排他関係が守れません NortifyIconとcontextMenuStripを組み合わせた画面選択制御は極く一般的なものでしょうが、皆さまはどのようにしているか教えて頂きたいと存じます 追伸】 contextMenuStripがクローズする原因が (1)contextMenuStrip内の項目の選択 (2)それ以外の原因 と判別出来る情報がありますか? これが分かれば対処法は簡単なのですが ・・・・・・

  • TreeView と DOMツリー

    C# WPF でプログラミングをしています。 TreeView に XML の階層構造を表示させて、ある項目を選択し、ボタンをクリックするとその項目の子ノードが追加されるようにするプログラムを作っています。 選択した項目(TreeView.SelectedItem(Object型)) を、DOMツリーの要素ノード (XmlElement型) にキャストし、それに新しく作った要素ノード(XmlElement型)をつなげるといったようにしているのですが、その際「挿入するノードは、異なるドキュメント コンテキストのものです。」のエラーが発生してしまいます。 XmlElement tvi = treeView.SelectedItem as XmlElement; XmlElement item = doc.CreateElement("item"); tvi.PrependChild(item); // エラー発生箇所 ※ doc は XmlDocument のインスタンスです。 解決策を教えてください。よろしくお願いします。

    • ベストアンサー
    • XML
  • どのオブジェクトでコンテキストメニューの項目をクリックしたか?

    大変申しありません。教えていただきたいのですが、 'メインのformで動的に幾つか作成します Dim pBox As New PictureBox 'VB studioでGUIで作成したコンテキストメニューをセットします pBox.ContextMenuStrip = ContextMenuStrip のような感じ(省略してあります)作りました。 そしてpBoxを右クリックしてコンテキストメニューのイベントを受け取ったのですが sender はコンテキストメニューアイテムでした。 右クリックされたpBoxを取得したい場合はどうすればよいでしょうか? スミマセン!!よろしくお願いします。

  • AndroidのPhoneGapのコンボの基本

    コンボのアイテム選択直後に発生するイベントでJavascriptの$('#formselecttag1 option:selected').val()で選んだアイテムの値が取得できるみたいなのですが、 これで取得できるのは<option value=1>2の場合、1と2にどちらが取得できるのでしょうか? また、それで取得できない方の値を取得するための方法も教えてください。

    • ベストアンサー
    • Java

専門家に質問してみよう