前回紹介した「フォーム上にあるコントロールを、右クリックでコンテキストメニューを表示して、フォーム上から動的に削除する(その1)」に引き続き、若干の変更を加え、今回は複数のコントロール(今回は、PictureBoxが2つ、Panelが1つ)がある場合についてのソースコードを紹介する。
本動作に必要な主なクラス・メソッドなどは次の通り。
ContextMenuStrip.SourceControlプロパティ
また、ContextMenuStripのインスタンスcontextMenuStripOnControlを異なったメソッド間で使用するために、その変数宣言をクラス直下で行うよう変更した。
以下にソースコードを示す。
using System;
using System.Drawing;
using System.Windows.Forms;
namespace TestContextMenu
{
class Form1 : Form
{
static void Main()
{
Application.Run(new Form1());
}
ContextMenuStrip contextMenuStripOnControl; // (変更)前回 Form()コンストラクタにあったものをクラス直下の変数とした。
public Form1()
{
contextMenuStripOnControl = new ContextMenuStrip(); // コントロール上で表示するコンテキストメニュー
// pictureBox1の定義
PictureBox pictureBox1;
pictureBox1 = new PictureBox();
pictureBox1.Location = new Point(50, 50);
pictureBox1.Size = new Size(100, 100);
pictureBox1.Image = Image.FromFile("play100_100.png");
pictureBox1.BorderStyle = BorderStyle.FixedSingle;
pictureBox1.Parent = this; // フォームにpictureBox1を追加する
// pictureBox2の定義 (追加変更)
PictureBox pictureBox2;
pictureBox2 = new PictureBox();
pictureBox2.Location = new Point(160, 50);
pictureBox2.Size = new Size(100, 100);
pictureBox2.Image = Image.FromFile("pause.png");
pictureBox2.BorderStyle = BorderStyle.FixedSingle;
pictureBox2.Parent = this; // フォームにpictureBox2を追加する
// panel1の定義 (追加変更)
Panel panel1;
panel1 = new Panel();
panel1.Location = new Point(50, pictureBox1.Location.X+pictureBox1.Height + 10);
panel1.Size = new Size(210, 50);
panel1.BackColor = Color.Blue;
panel1.Parent = this; // フォームにpanel1を追加する
// pictureBox1の上で表示するコンテキストメニュー
ToolStripMenuItem tsmiDelete = new ToolStripMenuItem("削除(&D)"); // コンテキストメニューで表示される項目 D
tsmiDelete.Click += new EventHandler(tsmiDelete_Click); // コンテキストメニューの中で「削除」を選択した時のデリゲート
contextMenuStripOnControl.Items.Add(tsmiDelete); // コンテキストメニューにtsmiDeleteを追加する
// 削除したいコントロールのContextMenuStripプロパティーにContextMenuStripのインスタンスを指定する。コントロール(pictureBox1,2とpanel1)の上で左クリックしたときに、ContextMenuStripのインスタンスのインスタンスであるcontextMenuStripOnControlに登録されたコンテキストメニューが表示されるようになる。
pictureBox1.ContextMenuStrip = contextMenuStripOnControl;
pictureBox2.ContextMenuStrip = contextMenuStripOnControl; // (追加変更)
panel1.ContextMenuStrip = contextMenuStripOnControl; // (追加変更)
}
// コントロール(pictureBox1,2とpanel1)の上でコンテキストメニューの「削除」を選択した時のイベントハンドラ
void tsmiDelete_Click(object sender, EventArgs e)
{
//Control c = contextMenuStripOnControl.SourceControl as Control; //下でも、或いはこのような記述でも可(但し全てもコントロールオブジェクトが消える (変更)
PictureBox c = contextMenuStripOnControl.SourceControl as PictureBox;// PictureBoxのオブジェクトのみをフォームから消す時 (変更)
if (c != null) // (追加変更)
{
this.Controls.Remove(c); // フォームに登録されたコントロール(PictureBox)のオブジェクトを消す
}
else MessageBox.Show("選択したのはPictureBoxではありません!"); // (追加変更)
}
}
}