学習記事一覧 · WinForms基礎

【学習】WinFormsでContextMenuStripを使ってみよう(右クリックでメニューを表示する)

これまでの学習では、

  • ボタンをクリックして処理を実行する
  • MenuStrip でメニューバーを作る

という形でプログラムを動かしてきました。

しかし、一覧の項目を右クリックして「削除」や「コピー」を選びたい場面があります。

右クリックでメニューを表示する

という仕組みです。

今回は ContextMenuStrip(コンテキストメニュー) を使って、右クリックでメニューが表示されるアプリを作ります。

今日作るもの

ListBox を右クリックすると

削除
コピー
---
貼り付け

というメニューが表示されます。

  • 削除 をクリック → 選択中の項目を削除
  • コピー をクリック → 選択中の項目をコピー
  • 貼り付け をクリック → コピーした項目を追加

区切り線で項目をグループ分けできます。


ソリューションとプロジェクトを作る

Visual Studio で新しいプロジェクトを作ります。

  • テンプレート: Windows Forms アプリ (.NET Framework)
  • ソリューション名: ContextMenuSample
  • プロジェクト名: ContextMenuStripDemo

作成すると Form1 が表示されます。


フォームに配置するコントロール

  1. ListBox をフォームに配置する(名前:itemListBox)
  2. ContextMenuStrip をフォームにドラッグする(コンポーネントトレイに配置される)
  3. ContextMenuStrip を選ぶと、フォーム上部に「ここに型を入力してください」と表示される
  4. 「削除」と入力して Enter
  5. 「コピー」と入力して Enter
  6. 右クリック → 挿入Separator で区切り線を追加
  7. 「貼り付け」と入力して Enter

メニュー項目の Name の例

表示テキスト 名前
削除 deleteToolStripMenuItem
コピー copyToolStripMenuItem
貼り付け pasteToolStripMenuItem

ListBox に ContextMenuStrip を関連付ける

  1. ListBox を選択する
  2. プロパティの ContextMenuStripcontextMenuStrip1 に設定する

これで ListBox を右クリックするとメニューが表示されます。


変数でコピー内容を保持する

貼り付け用に、コピーした項目を保持する変数が必要です。フォームのクラスに追加します。

private string copiedItem = "";  // コピーした項目

イベントを登録する

各メニュー項目をダブルクリックすると、Click イベントが作成されます。

  • 削除deleteToolStripMenuItem_Click
  • コピーcopyToolStripMenuItem_Click
  • 貼り付けpasteToolStripMenuItem_Click

完成コード

using System;
using System.Windows.Forms;

namespace ContextMenuStripDemo
{
    public partial class Form1 : Form
    {
        private string copiedItem = "";  // コピーした項目

        public Form1()
        {
            InitializeComponent();
            // 初期データを追加
            itemListBox.Items.Add("項目1");
            itemListBox.Items.Add("項目2");
            itemListBox.Items.Add("項目3");
        }

        private void deleteToolStripMenuItem_Click(object sender, EventArgs e)
        {
            if (itemListBox.SelectedIndex >= 0)
            {
                itemListBox.Items.RemoveAt(itemListBox.SelectedIndex);
            }
        }

        private void copyToolStripMenuItem_Click(object sender, EventArgs e)
        {
            if (itemListBox.SelectedItem != null)
            {
                copiedItem = itemListBox.SelectedItem.ToString();
            }
        }

        private void pasteToolStripMenuItem_Click(object sender, EventArgs e)
        {
            if (!string.IsNullOrEmpty(copiedItem))
            {
                itemListBox.Items.Add(copiedItem);
            }
        }
    }
}

プログラムの流れ

ListBox を右クリック

ContextMenuStrip が表示される

「削除」をクリック

deleteToolStripMenuItem_Click が呼ばれる

SelectedIndex で選択中の項目を取得

Items.RemoveAt で削除

「コピー」をクリック

SelectedItem を copiedItem に保存

「貼り付け」をクリック

copiedItem を Items.Add で追加

重要ポイント

ContextMenuStrip は「右クリックでメニューを表示する」 コンポーネントです。

  • ContextMenuStrip はコンポーネントトレイに配置する
  • コントロールの ContextMenuStrip プロパティで関連付ける
  • 関連付けたコントロールを右クリックするとメニューが表示される
  • Separator で区切り線を入れられる
  • 各メニュー項目も Click イベントが使える
  • ListBox、TextBox、フォームなど、複数のコントロールに設定できる

発展:フォーム全体に右クリックメニュー

Form の ContextMenuStrip プロパティに contextMenuStrip1 を設定すると、フォームの空白部分を右クリックするとメニューが表示されます。


発展:選択中の項目を表示する

メニュー項目のテキストを動的に変えるには、Opening イベントを使います。

private void contextMenuStrip1_Opening(object sender, System.ComponentModel.CancelEventArgs e)
{
    if (itemListBox.SelectedItem != null)
    {
        deleteToolStripMenuItem.Text = $"「{itemListBox.SelectedItem}」を削除";
    }
}

発展アイデア

ContextMenuStrip を使うと次のようなものも作れます。

  • 一覧の右クリックメニュー(削除、編集、コピー)
  • テキストボックスの右クリックメニュー(元に戻す、コピー、貼り付け)
  • 画像の右クリックメニュー(保存、別名で保存)
  • フォームの右クリックメニュー(設定を開く)

ContextMenuStrip はアプリの操作性を高めるための基本コンポーネントです。