【学習】WinFormsでContextMenuStripを使ってみよう(右クリックメニューを表示する)
広告
ContextMenuStrip は、コントロールを右クリックしたときに表示するメニューです。ListBoxの項目に「コピー」「削除」などの操作を追加できます。

今回作るもの
ListBoxの項目を右クリックすると「コピー」と「削除」が表示されるアプリを作ります。
プロジェクトを作る
Visual Studio で新しいプロジェクトを作ります。
- テンプレート: Windows Forms アプリ (.NET Framework)
- ソリューション名: ContextMenuSample
- プロジェクト名: ContextMenuStripDemo
作成すると Form1 というウィンドウが表示されます。これが フォーム です。
フォームに配置するもの
| コントロール | Name | 役割 |
|---|---|---|
| ListBox | itemListBox | 項目を表示する |
| ContextMenuStrip | itemContextMenuStrip | 右クリックメニュー |
ContextMenuStrip は画面上に直接表示されるコントロールではありません。フォームへ追加すると、デザイナー下部のコンポーネントトレイに表示されます。
コントロールの配置例
次の図は配置の一例です。青いラベルを参考に、プロパティウィンドウで Name を設定してください。

メニュー項目を追加する
itemContextMenuStripを選択する- 「ここへ入力」に「コピー」と入力する
- 次の行に「削除」と入力する
- Nameをそれぞれ
copyMenuItem、deleteMenuItemにする
ListBoxと関連付ける
itemListBox の ContextMenuStrip プロパティを itemContextMenuStrip に設定します。これでListBox上の右クリックに反応してメニューが表示されます。
項目を準備する
public Form1()
{
InitializeComponent();
itemListBox.Items.Add("りんご");
itemListBox.Items.Add("みかん");
itemListBox.Items.Add("ぶどう");
}
コピー処理
private void copyMenuItem_Click(object sender, EventArgs e)
{
if (itemListBox.SelectedItem is string text)
{
Clipboard.SetText(text);
}
}
何も選択されていない場合は処理しません。Clipboard.SetText には空文字列を渡せないため、選択の確認が大切です。
削除処理
private void deleteMenuItem_Click(object sender, EventArgs e)
{
int index = itemListBox.SelectedIndex;
if (index >= 0)
{
itemListBox.Items.RemoveAt(index);
}
}
右クリックした項目を選択する
標準のListBoxでは、右クリックだけでは選択項目が切り替わらないことがあります。右クリックした場所の項目を操作したい場合は、MouseDown イベントで選択を合わせます。
private void itemListBox_MouseDown(object sender, MouseEventArgs e)
{
if (e.Button != MouseButtons.Right)
{
return;
}
int index = itemListBox.IndexFromPoint(e.Location);
if (index >= 0)
{
itemListBox.SelectedIndex = index;
}
}
まとめ
- ContextMenuStripは右クリック時の操作をまとめる
- 対象コントロールのContextMenuStripプロパティで関連付ける
- 選択項目がない場合を必ず考える
- 右クリックした項目を扱うならMouseDownで選択を合わせる
広告
C#,WindowsFormアプリ,初学者C#,ContextMenuStrip,ListBox,WinForms,初学者
Posted by hidepon
関連記事

〖C#入門〗メソッドのオーバーロードと省略可能な引数をAddで学ぼう
前回は、Addをstaticメソッドにして、Calc.Add(5, 3)と呼び出 ...

【学習】WinFormsでToolTipを使ってみよう(マウスオーバーでヒントを表示する)
これまでの学習では、 ボタンやテキストボックスを配置する Label で説明文を ...

【C#学習法】完成コードを上から写さない|ターン制バトルを大きなブロックから組み立てる写経術
プログラミングの写経というと、完成コードを1行目から順番に入力する方法を思い浮か ...

【C#】カードをシャッフルするメソッドはどこに置くべき?CardとDeckの責務を考える
トランプのカードを表すCard構造体を作ったとき、「カードをシャッフルするメソッ ...

【学習】WinFormsでUserControlを使ってみよう(複数コントロールを1つにまとめる)
これまでの学習では、 フォームに1つずつコントロールを配置する Button、T ...







ディスカッション
コメント一覧
まだ、コメントがありません