DOBON.NET プログラミング道: .NET Framework, VB.NET, C#, Visual Basic, Visual Studio, インストーラ, ...

コントロールを実行時に作成する

コントロールをフォームに配置する時、通常はVisual Studioのフォームデザイナを使って行うでしょう。しかし、実行時に、動的にコントロールを作成してフォームに配置する必要もあるでしょう。ここでは、Buttonコントロールをフォームに配置する方法を例に、コントロールを実行時に作成する方法を説明します。

コントロールを作成し、フォームに表示する

"Button1"というButtonコントロールを作成して、フォームに表示するには、次のようにします。

VB.NET
コードを隠すコードを選択
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
C#
コードを隠すコードを選択
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イベントを捕捉するコードを追加した例のみを示します。

VB.NET
コードを隠すコードを選択
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
C#
コードを隠すコードを選択
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メソッドを使用する例を以下に示します。

VB.NET
コードを隠すコードを選択
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
C#
コードを隠すコードを選択
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メソッドについては「コントロールのレイアウトを一時中断して、パフォーマンスを向上させる」で詳しく説明していますので、そちらをご覧ください。

注意:この記事では、基本的な事柄の説明が省略されているかもしれません。初心者の方は、特に以下の点にご注意ください。

  • イベントハンドラの意味が分からない、C#のコードをそのまま書いても動かないという方は、こちらをご覧ください。
  • .NET Tipsをご利用いただく際は、注意事項をお守りください。