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

このQ&Aのポイント
  • C#にてフォームアプリを作成しています。そこでツリービューに表示されたノードを右クリックしたときにコンテキストメニューが表示されるように記述しました。しかし、イベントハンドラの書き方がよくわかりません。
  • 表示されたノードの上で右クリックすると「Export」、「Import」というメニューが表示されます。しかし、イベントハンドラの書き方がよくわかりません。
  • 「Export」又は「Import」がクリックされたというイベントはどう検出すればよいでしょうか。
回答を見る
  • ベストアンサー

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

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; } }

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

  • ベストアンサー
回答No.1

ToolStripMenuItemにはClickイベントがありますから,Clickイベントを普通に検出すればよいです。 詳しくはC#の文法書をお読みください。 a) ラムダ式を使ってハンドラを書く openLabel.Click += (_, __) => { MessageBox.Show(this, "Export"); }; deleteLabel.Click += (_, __) => { MessageBox.Show(this, "Import"); }; b) 別途メソッドを用意してハンドラを追加する private openLabel_Click (object sender, EventArgs e) { MessageBox.Show(this, "Export"); } private deleteLabel_Click (object sender, EventArgs e) { MessageBox.Show(this, "Import"); } openLabel.Click += openLabel_Click; deleteLabel.Click += deleteLabel_Click;

unko347
質問者

お礼

ご回答ありがとうございます。 ご提示頂きました、b)の手法を用いさせていただきました。 ありがとうございました。

関連するQ&A

  • 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()); }

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

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

  • 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にキャストすればよいかと思ったのですがエラーになります・・・ }

  • 標準コンテキストメニューのイベント取得方法について

    お世話になります。 現在、VS2010 C#で作成したTextboxの右クリック時に表示される コンテキストメニュー(元に戻す、切り取り、コピー他)を選択された時の イベントが取得できず調査しております。 下記、参考サイト(2)を見てみたのですが、 Formのload時に「this.○○.ContextMenuStrip.Opening」を 実施しても「ContextMenuStrip」がnullとなります。。。 何か方法がございましたらご教示頂けないでしょうか? ■参考サイト (1)http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=35503&forum=7 (2)http://blogs.yahoo.co.jp/kenatzh/31673805.html

  • コンテキストメニューアイテムの右クリック左クリック

    よろしくお願いします。環境はVB2008です。 フォーム上にコンテキストメニューを配置し、右クリックで表示します。 そのあとにアイテムをクリックすると別のフォームが開くようにしてるのですが、右クリックでも左クリックでも同様にフォームが開いてしまいます。これを左クリックされたときのみ別のフォームを表示するようにするにはどのようにすれば宜しいでしょうか。ぜひご教授願います。

  • ToolStripMenuItemの選択(VB)

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

  • エクスプローラーの右クリックでるコンテキストメニューの変更

    エクスプローラーを開いて、あるファイルをポイントし、 右クリックすると、コンテキストメニューがでてきますが、 このメニューがいつの間に変わってしまいました。 通常だと一番上に 開く が表示されると思うのですが、 削除 が出てきます。 これを元に戻したいのですが、 どなたか方法について教えてください。 よろしくお願いします。

  • ExcelVBAのコンテキストメニューの順番変更

    VBAのコード入力画面で、右クリックをしたときに表示される コンテキストメニューですが、 並び順を変更できたはずなのですが忘れてしまいました。 ご存じでしたら教えて頂けませんでしょうか。 切り取り コピー 貼り付け プロパティ/メソッドの一覧 定義の一覧 ・・・ と表示されるコンテキストメニューの並び替えです。 エクセルのシート上での右クリックのコンテキストメニューではありません。

  • コンテキストメニューの表示方法

    画面上で右クリックしても、コンテキストメニュー?が出ません、表示する方法はありませんか、ウィンドウズMEです。

  • [C#] ContextMenuStrip を呼び出したセルの特定

    DataGridViewのどのセルを右クリックしてポップアップメニュー(ContextMenuStrip) が表示されたか知りたいのですが using System; using System.Windows.Forms; public class MyForm : Form { DataGridView dgv; DataGridViewTextBoxColumn dgvColumn1; FileDialog fileDlg; ContextMenuStrip popup; ToolStripMenuItem popupItem; public MyForm() { dgv = new DataGridView(); dgvColumn1 = new DataGridViewTextBoxColumn(); fileDlg = new OpenFileDialog(); popup = new ContextMenuStrip(); popupItem = new ToolStripMenuItem(); dgvColumn1.HeaderText = "column1"; dgvColumn1.ContextMenuStrip = popup; dgv.Dock = DockStyle.Fill; dgv.RowTemplate.Height = 16; dgv.Columns.Add(dgvColumn1); popupItem.Text = "file"; popupItem.MouseUp += delegate(object sender, MouseEventArgs e) { if (fileDlg.ShowDialog() == DialogResult.OK) { //右クリックしたセル.Text = filedlg.FileName; } }; // popup menu popup.Items.Add(popupItem); Controls.Add(dgv); } } 上のソースにて、 http://dobon.net/vb/dotnet/control/cmsourcecontrol.html にあるように、popup.SourceControlを用いても、DataGridView コントロールしか返って来ません。 となると、DataGridViewのCellMouseEventハンドラを実装する必要が出てくると思うのですがこれ以外解決方法ってないですかね・・?

専門家に質問してみよう