C#:プログラムからフォーム部品を生成する

C#

フォームに直接ボタンなどのフォームを貼り付けずにC#スクリプトからボタンやテキストボックスなどのフォームコントロール(フォームで利用できる部品)を生成する方法です。

プロジェクトの準備

Visual Studioを起動し、

プロジェクトの新規作成 > C# Windows フォームアプリケーション(.NET Framework) を選択します。
プロジェクト名を「プログラムからフォーム部品を生成する」としてプロジェクトを新規作成します。

フォームコントロールの生成とフォームへの追加の基本

例として、スクリプトからフォーム上にボタンを1つ作るには、

Button button1 = new Button();		// ボタンコントロールを生成
button1.Name = "btn1";			// ボタン名称
button1.Text = "おしてね";		// ボタン文字列
this.Controls.Add(button1);		// フォームに追加

のようにフォームコントロールクラス(上記例ではButtonクラス)をインスタンス化して、プロパティを設定しフォーム上に生成できます。

それでは実際に先ほど作ったプロジェクトで作っていきます。

起動時にフォームにボタンを1つ生成する

起動するとフォーム上にボタンが1つ表示されるスクリプトです。

デザイン画面上のForm1をダブルクリックしてForm1.csを表示させます。

ボタンを生成するスクリプトは、関数CreateButton()にまとめました。
起動時(Form_Load時)にCreateButton関数を呼び出してボタンが自動生成される流れです。

以下のハイライト部分のスクリプトを入力します。(プロジェクト名が同じであれば、全てをコピー&貼り付けでも動作すると思います)

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace プログラムからフォーム部品を生成する
{
	public partial class Form1 : Form
	{
		private Button button1;

		public Form1()
		{
			InitializeComponent();
		}
		private void Form1_Load(object sender, EventArgs e)
		{
			this.Text = "フォーム部品を生成する";
			CreateButton();
		}

		private void CreateButton()
		{
			button1 = new Button();			// ボタンコントロールを生成
			button1.Name = "btn1";			// ボタン名称
			button1.Text = "おしてね";		// ボタン文字列
			this.Controls.Add(button1);		// フォームに追加(これで配置される)
		}
	}
}

実行するとフォーム左上にボタンが1つ生成されているのが分かります。
ボタンイベントは設定していませんので、当然ながらボタンを押しても何も起きません

ボタンの配置とイベント処理設定方法

とりあえずボタンは生成できましたが、実際に利用するにはボタンの配置押した時の処理イベント処理)も必要です。

次はボタンの配置方法イベント設定方法についてもみていきます。

ボタンの配置方法

まずはボタンの配置です。

先ほど作ったスクリプトの関数CreateButtonにLocationSizeプロパティの2項目を追加します。

private void CreateButton()
{
	button1 = new Button();			// ボタンコントロールを生成
	button1.Name = "btn1";			// ボタン名称
	button1.Text = "おしてね";		// ボタン文字列
	button1.Location = new Point(100, 50);	// 位置(x座標, y座標)
	button1.Size = new Size(200, 100);	// ボタンの幅と高さ
	this.Controls.Add(button1);		// フォームに追加(これで配置される)
}

Locationは通常フォームコントロールを配置したときにプロパティ画面に表示されるLocation項目を表しています。スクリプトでは、Pointクラスを使って new Point( x座標, y座標 ) のように記述できます。

手動でボタンを追加した際のLocationプロパティのイメージ

Sizeもやはりプロパティ画面でいうところのSize項目を表します。
スクリプトでは、Sizeクラスを使って new Size( 幅, 高さ ) のように記述できます。

手動でボタンを追加した際のSizeプロパティのイメージ

実行すると設定した位置(Location)と大きさ(Size)でフォーム上にボタンが生成され表示されます。

ボタンプロパティの記述を簡潔にする

ボタンプロパティの設定に何度も変数button1が記述されています。

button1 = new Button();
button1.Name = "btn1";			// ボタン名称
button1.Text = "おしてね";		// ボタン文字列
button1.Location = new Point(100, 50);	// 位置(x座標, y座標)
button1.Size = new Size(200, 100);	// ボタンの幅と高さ

オブジェクト初期化子を使うとボタン生成と同時にプロパティ設定を以下のように簡潔に記述もできます。(プロパティを複数設定する際は、, (カンマ)区切りであることに注意してください)

button1 = new Button
{
	Name = "btn1",          // ボタン名称
	Text = "おしてね",      // ボタン文字列
	Location = new Point(100, 50),  // 位置(x座標, y座標)
	Size = new Size(200, 100)   // ボタンの幅と高さ
};

どちらも意味は同じですが、書式指定子を利用するとぱっと見たとき何の設定かが一目瞭然です。

ボタンイベントの設定方法

次はボタンイベント設定についてです。

例としてボタンを押したらメッセージボックスにボタンのNameプロパティを表示させます。

実行イメージ

ボタンを押した時の処理は関数Button1Click()に設定しておきます。

private void Button1Click(object sender, EventArgs e)
{
	Button button = (Button)sender;
	MessageBox.Show(button.Name + "をクリックしたよ!", "ボタンイベント確認", MessageBoxButtons.OK);
}

どのボタンが押されているか?の情報は、Button1Clickに指定した第1引数のsenderで取得できます。

Button button = (Button)sender;

とするだけで、ボタンのインスタンスが簡単に取り出せるため、プロパティにもbutton.Nameなどのようにアクセスできるようになります。

関数Button1Clickを生成したボタンを押した時に呼び出すには、CreateButton関数内で以下の様に記述します。

this.button1.Click += new System.EventHandler(Button1Click);

フォームのイベント処理への追加なので、this.button1.Click = ~ ではなく、this.button1.Click += ~である点に注意してください。

ソースコード全体

ここまでのForm1.cs全体スクリプトを示します。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace プログラムからフォーム部品を生成する
{
	public partial class Form1 : Form
	{
		private Button button1;

		public Form1()
		{
			InitializeComponent();
		}

		private void Form1_Load(object sender, EventArgs e)
		{
			this.Text = "フォーム部品を生成する";
			CreateButton();
		}

		private void Button1Click(object sender, EventArgs e)
		{
			Button button = (Button)sender;
			MessageBox.Show(button.Name + "をクリックしたよ!", "ボタンイベント確認", MessageBoxButtons.OK);
		}

		private void CreateButton()
		{
			// ボタンコントロールを生成
			button1 = new Button
			{
				Name = "btn1",          // ボタン名称
				Text = "おしてね",      // ボタン文字列
				Location = new Point(100, 50),  // 位置(x座標, y座標)
				Size = new Size(200, 100)   // ボタンの幅と高さ
			};

			// クリックイベント設定
			this.button1.Click += new System.EventHandler(Button1Click);	
			
			// フォームに追加(これでフォームに表示される)
			this.Controls.Add(button1);	
		}
	}
}

実行してボタンクリック時にメッセージボックスが表示されたら成功です!

実行イメージ

応用:複数のボタンとイベントを設定する

ここまではボタンコントロールを1つ生成しただけでした。
一度に複数のコントロールを生成したい場合についてもみていきます。

イメージボタンが横に5つ並んだフォームを生成します)

新たにプロジェクトを作成します。
C# Windows フォームアプリケーション(.NET Framework) を選択し、プロジェクト名を「プログラムから複数のフォーム部品を生成する」とします。

基本的にはボタンを1つ生成したときと同じ流れです。

先頭でボタンコントロールを配列で宣言しておきます。

private Button[] buttons;

ボタンはForm_Loadイベントで5つインスタンス化し、生成したボタンの数(buttons.Length)をCreateButtons関数の引数として呼び出しています。(new Button[3]などと数値を変えてみてください)

private void Form1_Load(object sender, EventArgs e)
{
	this.Text = "複数のフォーム部品を生成する";
	buttons = new Button[5];
	CreateButtons(buttons.Length);
}

CreateButtons関数では、生成した複数のボタンの配置とイベント処理を設定しています。

private void CreateButtons(int length)
{
	for(int i=0; i<length; i++)
	{
		// ボタン名、配置等の設定
		buttons[i] = new Button
		{
			Name = "btn" + i.ToString(),
			Text = "ボタン" + i.ToString(),
			Location = new Point(40 + i * 80, 200),
			Size = new Size(80, 40)
		};

		// クリックイベント時の設定
		buttons[i].Click += new System.EventHandler(ButtonsClick);

		// フォームに追加
		Controls.Add(buttons[i]);
	}
}

実際にボタンを押した時に実行されるButtonsClick関数の中身は以下の通りです。

private void ButtonsClick(object sender, EventArgs e)
{
	Button button = (Button)sender;
	MessageBox.Show(button.Name + "をクリックしたよ!", "ボタンイベント確認", MessageBoxButtons.OK);
}

ButtonsClick関数の第1引数で指定したsenderで押したボタンを特定出来る点は前述の通りです。

実行イメージです。
ボタン毎に設定したNameプロパティがメッセージボックスに表示されます。

ソースコード全体

応用:複数のボタンとイベントを設定するで解説したソースコード全体を示します。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace プログラムから複数のフォーム部品を生成する
{
	public partial class Form1 : Form
	{
		private Button[] buttons;

		public Form1()
		{
			InitializeComponent();
		}

		private void Form1_Load(object sender, EventArgs e)
		{
			this.Text = "複数のフォーム部品を生成する";
			buttons = new Button[5];
			CreateButtons(buttons.Length);
		}

		private void ButtonsClick(object sender, EventArgs e)
		{
			Button button = (Button)sender;
			MessageBox.Show(button.Name + "をクリックしたよ!", "ボタンイベント確認", MessageBoxButtons.OK);
		}

		private void CreateButtons(int length)
		{
			for(int i=0; i<length; i++)
			{
				// ボタン名、配置等の設定
				buttons[i] = new Button
				{
					Name = "btn" + i.ToString(),
					Text = "ボタン" + i.ToString(),
					Location = new Point(40 + i * 80, 200),
					Size = new Size(80, 40)
				};

				// クリックイベント時の設定
				buttons[i].Click += new System.EventHandler(ButtonsClick);

				// フォームに追加
				Controls.Add(buttons[i]);
			}
		}
	}
}

ボタン以外のLabelCheckBoxコントロール等でも生成方法は同じですので、ぜひ活用してみてください。

以上、C#:プログラムからフォーム部品を生成するでした。

コメント

タイトルとURLをコピーしました