コントロールをフォームに配置する時、通常はVisual Studioのフォームデザイナを使って行うでしょう。しかし、実行時に、動的にコントロールを作成してフォームに配置する必要もあるでしょう。ここでは、Buttonコントロールをフォームに配置する方法を例に、コントロールを実行時に作成する方法を説明します。
"Button1"というButtonコントロールを作成して、フォームに表示するには、次のようにします。
Private Button1 As System.Windows.Forms.Button 'フォームのLoadイベントハンドラ Private Sub Form1_Load(ByVal sender As Object, _ ByVal e As EventArgs) Handles MyBase.Load 'Buttonクラスのインスタンスを作成する Me.Button1 = New System.Windows.Forms.Button() 'Buttonコントロールのプロパティを設定する Me.Button1.Name = "Button1" Me.Button1.Text = "押してね" 'サイズと位置を設定する Me.Button1.Location = New Point(10, 10) Me.Button1.Size = New System.Drawing.Size(80, 20) 'フォームに追加する Me.Controls.Add(Me.Button1) End Sub
private System.Windows.Forms.Button Button1; //フォームのLoadイベントハンドラ private void Form1_Load(object sender, EventArgs e) { //Buttonクラスのインスタンスを作成する this.Button1 = new System.Windows.Forms.Button(); //Buttonコントロールのプロパティを設定する this.Button1.Name = "Button1"; this.Button1.Text = "押してね"; //サイズと位置を設定する this.Button1.Location = new Point(10, 10); this.Button1.Size = new System.Drawing.Size(80, 20); //フォームに追加する this.Controls.Add(this.Button1); }
Buttonクラスのインスタンスを作成し、必要なプロパティを設定し、フォームのControlsプロパティのAddメソッドを使ってフォームに配置しています。
ここではフォームのLoadイベントハンドラで行いましたが、フォームクラスのコンストラクタで行う方法もあります。
注意:上記のC#のコードは、このままコピーしただけでは動きません。イベントハンドラをイベントに関連付ける必要があります。この方法については、こちらで説明しています。
コントロールのイベントを捕捉する方法は、「イベントを捕捉する」で説明していますので、そちらをご覧ください。
ここでは、上記のコードにButton1のClickイベントを捕捉するコードを追加した例のみを示します。
Private Button1 As System.Windows.Forms.Button 'フォームのLoadイベントハンドラ Private Sub Form1_Load(ByVal sender As Object, _ ByVal e As EventArgs) Handles MyBase.Load 'Buttonクラスのインスタンスを作成する Me.Button1 = New System.Windows.Forms.Button() 'Buttonコントロールのプロパティを設定する Me.Button1.Name = "Button1" Me.Button1.Text = "押してね" 'サイズと位置を設定する Me.Button1.Location = New Point(10, 10) Me.Button1.Size = New System.Drawing.Size(80, 20) 'Clickイベントハンドラを追加する AddHandler Me.Button1.Click, AddressOf Button1_Click 'フォームに配置する Me.Controls.Add(Me.Button1) End Sub Private Sub Button1_Click(ByVal sender As Object, _ ByVal e As EventArgs) Console.WriteLine("Button1がクリックされました") End Sub
private System.Windows.Forms.Button Button1; //フォームのLoadイベントハンドラ private void Form1_Load(object sender, EventArgs e) { //Buttonクラスのインスタンスを作成する this.Button1 = new System.Windows.Forms.Button(); //Buttonコントロールのプロパティを設定する this.Button1.Name = "Button1"; this.Button1.Text = "押してね"; //サイズと位置を設定する this.Button1.Location = new Point(10, 10); this.Button1.Size = new System.Drawing.Size(80, 20); //Clickイベントハンドラを追加する this.Button1.Click += new EventHandler(Button1_Click); //フォームに配置する this.Controls.Add(this.Button1); } private void Button1_Click(object sender, EventArgs e) { Console.WriteLine("Button1がクリックされました"); }
補足:複数のコントロールを一度にフォームに配置するには、Addメソッドの代わりに、AddRangeメソッドを使うこともできます。AddRangeメソッドを使用した例は、「コントロールの配列を作成する」をご覧ください。
コントロールをフォームに配置するとき、その前にSuspendLayoutメソッドを呼び出してレイアウトロジックを一時停止させることにより、パフォーマンスが向上します。特にたくさんのコントロールをフォームに配置する時は、SuspendLayoutメソッドを使用した方がよいでしょう。
SuspendLayoutメソッドを使用する例を以下に示します。
Private Button1 As System.Windows.Forms.Button 'フォームのLoadイベントハンドラ Private Sub Form1_Load(ByVal sender As Object, _ ByVal e As EventArgs) Handles MyBase.Load 'Buttonクラスのインスタンスを作成する Me.Button1 = New System.Windows.Forms.Button() 'フォームのレイアウトロジックを中断する Me.SuspendLayout() 'Buttonコントロールのプロパティを設定する Me.Button1.Name = "Button1" Me.Button1.Text = "押してね" 'サイズと位置を設定する Me.Button1.Location = New Point(10, 10) Me.Button1.Size = New System.Drawing.Size(80, 20) 'フォームに追加する Me.Controls.Add(Me.Button1) 'フォームのレイアウトロジックを再開する Me.ResumeLayout(False) End Sub
private System.Windows.Forms.Button Button1; //フォームのLoadイベントハンドラ private void Form1_Load(object sender, EventArgs e) { //Buttonクラスのインスタンスを作成する this.Button1 = new System.Windows.Forms.Button(); //フォームのレイアウトロジックを中断する this.SuspendLayout(); //Buttonコントロールのプロパティを設定する this.Button1.Name = "Button1"; this.Button1.Text = "押してね"; //サイズと位置を設定する this.Button1.Location = new Point(10, 10); this.Button1.Size = new System.Drawing.Size(80, 20); //フォームに追加する this.Controls.Add(this.Button1); //フォームのレイアウトロジックを再開する this.ResumeLayout(false); }
SuspendLayoutとResumeLayoutメソッドについては「コントロールのレイアウトを一時中断して、パフォーマンスを向上させる」で詳しく説明していますので、そちらをご覧ください。