LoginSignup
0
0

More than 3 years have passed since last update.

フォーム上にあるコントロールを、右クリックでコンテキストメニューを表示して、フォーム上から動的に削除する(その2:削除したいコントロールが複数ある場合)

Last updated at Posted at 2020-03-28

前回紹介した「フォーム上にあるコントロールを、右クリックでコンテキストメニューを表示して、フォーム上から動的に削除する(その1)」に引き続き、若干の変更を加え、今回は複数のコントロール(今回は、PictureBoxが2つ、Panelが1つ)がある場合についてのソースコードを紹介する。

   動作イメージPic2削除前.png   動作イメージPic2削除後.png
                      pictureBox2を削除する様子

   panel1削除エラーメッセージ.png
    panel1を削除しようとして、削除できない様子

 本動作に必要な主なクラス・メソッドなどは次の通り。
  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ではありません!");     // (追加変更)
        }

    }
}


pictureBox1に入れ込む画像例
play100_100.png
pause.png

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0