【学習】WinFormsでContextMenuStripを使ってみよう(右クリックでメニューを表示する)
これまでの学習では、
- ボタンをクリックして処理を実行する
- MenuStrip でメニューバーを作る
という形でプログラムを動かしてきました。
しかし、一覧の項目を右クリックして「削除」や「コピー」を選びたい場面があります。
右クリックでメニューを表示する
という仕組みです。
今回は ContextMenuStrip(コンテキストメニュー) を使って、右クリックでメニューが表示されるアプリを作ります。
今日作るもの
ListBox を右クリックすると
削除
コピー
---
貼り付けというメニューが表示されます。
- 削除 をクリック → 選択中の項目を削除
- コピー をクリック → 選択中の項目をコピー
- 貼り付け をクリック → コピーした項目を追加
区切り線で項目をグループ分けできます。
ソリューションとプロジェクトを作る
Visual Studio で新しいプロジェクトを作ります。
- テンプレート: Windows Forms アプリ (.NET Framework)
- ソリューション名: ContextMenuSample
- プロジェクト名: ContextMenuStripDemo
作成すると Form1 が表示されます。
フォームに配置するコントロール
- ListBox をフォームに配置する(名前:itemListBox)
- ContextMenuStrip をフォームにドラッグする(コンポーネントトレイに配置される)
- ContextMenuStrip を選ぶと、フォーム上部に「ここに型を入力してください」と表示される
- 「削除」と入力して Enter
- 「コピー」と入力して Enter
- 右クリック → 挿入 → Separator で区切り線を追加
- 「貼り付け」と入力して Enter
メニュー項目の Name の例
| 表示テキスト | 名前 |
|---|---|
| 削除 | deleteToolStripMenuItem |
| コピー | copyToolStripMenuItem |
| 貼り付け | pasteToolStripMenuItem |
ListBox に ContextMenuStrip を関連付ける
- ListBox を選択する
- プロパティの ContextMenuStrip を contextMenuStrip1 に設定する
これで 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 はアプリの操作性を高めるための基本コンポーネントです。