Quantcast
Channel: C#タグが付けられた新着記事 - Qiita
Viewing all articles
Browse latest Browse all 9318

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

$
0
0

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

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

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

 本動作に必要な主なクラス・メソッドなどは次の通り。
  ContextMenuStrip.SourceControlプロパティ

 また、ContextMenuStripのインスタンスcontextMenuStripOnControlを異なったメソッド間で使用するために、その変数宣言をクラス直下で行うよう変更した。

 以下にソースコードを示す。

usingSystem;usingSystem.Drawing;usingSystem.Windows.Forms;namespaceTestContextMenu{classForm1:Form{staticvoidMain(){Application.Run(newForm1());}ContextMenuStripcontextMenuStripOnControl;// (変更)前回 Form()コンストラクタにあったものをクラス直下の変数とした。publicForm1(){contextMenuStripOnControl=newContextMenuStrip();// コントロール上で表示するコンテキストメニュー// pictureBox1の定義PictureBoxpictureBox1;pictureBox1=newPictureBox();pictureBox1.Location=newPoint(50,50);pictureBox1.Size=newSize(100,100);pictureBox1.Image=Image.FromFile("play100_100.png");pictureBox1.BorderStyle=BorderStyle.FixedSingle;pictureBox1.Parent=this;// フォームにpictureBox1を追加する// pictureBox2の定義  (追加変更)PictureBoxpictureBox2;pictureBox2=newPictureBox();pictureBox2.Location=newPoint(160,50);pictureBox2.Size=newSize(100,100);pictureBox2.Image=Image.FromFile("pause.png");pictureBox2.BorderStyle=BorderStyle.FixedSingle;pictureBox2.Parent=this;// フォームにpictureBox2を追加する// panel1の定義  (追加変更)Panelpanel1;panel1=newPanel();panel1.Location=newPoint(50,pictureBox1.Location.X+pictureBox1.Height+10);panel1.Size=newSize(210,50);panel1.BackColor=Color.Blue;panel1.Parent=this;// フォームにpanel1を追加する// pictureBox1の上で表示するコンテキストメニューToolStripMenuItemtsmiDelete=newToolStripMenuItem("削除(&D)");// コンテキストメニューで表示される項目 DtsmiDelete.Click+=newEventHandler(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)の上でコンテキストメニューの「削除」を選択した時のイベントハンドラvoidtsmiDelete_Click(objectsender,EventArgse){//Control c = contextMenuStripOnControl.SourceControl as Control;      //下でも、或いはこのような記述でも可(但し全てもコントロールオブジェクトが消える   (変更)PictureBoxc=contextMenuStripOnControl.SourceControlasPictureBox;// PictureBoxのオブジェクトのみをフォームから消す時   (変更)if(c!=null)// (追加変更){this.Controls.Remove(c);// フォームに登録されたコントロール(PictureBox)のオブジェクトを消す}elseMessageBox.Show("選択したのはPictureBoxではありません!");// (追加変更)}}}

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


Viewing all articles
Browse latest Browse all 9318

Latest Images

Trending Articles