子育てエンジニアブログ

子育てに励むシステムエンジニア(SE)のブログ

【C#】Windows Formで動的にコントロールを配置する方法

Windows Formで動的にコントロールを配置する方法についてです。

リストや配列の数だけ、ループで回してボタンやラベル等を動的に作成したいということが時々ありますよね?
そんな時に使える方法です。

方針としては、コントロールを作成するメソッドを作っておき、それを配列やリストの数だけループで呼び出します。

まずは、出来上がった画面から。
今回は、パネルを作成しておき、そこにラベルとボタンを動的に作成しています。
パネルを事前に作成して起き、そのパネルに追加することで、画面サイズからはみ出した場合を考慮しなくてもいいようにしています。
f:id:STSA:20200301142000p:plain

では早速ソースです。
動的にコントロールを作成する場合は、Location をずらしてあげる必要がありますね。
そのため、カウンタを用意して配置場所が動的に変わるようにしています。

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 WindowsFormsApp1
{
    public partial class Form1 : Form
    {

        //何件追加したか
        public int counter = 0;

        public Form1()
        {
            InitializeComponent();

            //20個ラベル、ボタンを作成
            for (int i = 20; i >= 0; i--)
            {
                addControl();
            }
            
        }

        /// <summary>
        /// 動的に追加
        /// </summary>
        public void addControl() {
            LinkLabel link = new LinkLabel();
            link.Location = new Point(12, 20 + counter * 50);
            link.Size = new Size(50, 19);
            link.TabIndex = counter;
            link.Text = counter.ToString();

            //パネルにラベルリンクを追加
            this.panel1.Controls.Add(link);

            Button btn = new Button();
            btn.Location = new Point(80, 20 + counter * 50);
            btn.Text = counter.ToString();
            btn.Name = counter.ToString();
            btn.Size = new System.Drawing.Size(75, 23);

            //パネルにボタンを追加
            this.panel1.Controls.Add(btn);

            counter++;

        }

    }
}


Form1.Designer.cs

namespace WindowsFormsApp1
{
    partial class Form1
    {
        /// <summary>
        /// 必要なデザイナー変数です。
        /// </summary>
        private System.ComponentModel.IContainer components = null;

        /// <summary>
        /// 使用中のリソースをすべてクリーンアップします。
        /// </summary>
        /// <param name="disposing">マネージ リソースを破棄する場合は true を指定し、その他の場合は false を指定します。</param>
        protected override void Dispose(bool disposing)
        {
            if (disposing && (components != null))
            {
                components.Dispose();
            }
            base.Dispose(disposing);
        }

        #region Windows フォーム デザイナーで生成されたコード

        /// <summary>
        /// デザイナー サポートに必要なメソッドです。このメソッドの内容を
        /// コード エディターで変更しないでください。
        /// </summary>
        private void InitializeComponent()
        {
            this.panel1 = new System.Windows.Forms.Panel();
            this.SuspendLayout();
            // 
            // panel1
            // 
            this.panel1.AutoScroll = true;
            this.panel1.Location = new System.Drawing.Point(12, 12);
            this.panel1.Name = "panel1";
            this.panel1.Size = new System.Drawing.Size(397, 330);
            this.panel1.TabIndex = 0;
            // 
            // Form1
            // 
            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F);
            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
            this.ClientSize = new System.Drawing.Size(448, 419);
            this.Controls.Add(this.panel1);
            this.Name = "Form1";
            this.Text = "Form1";
            this.ResumeLayout(false);

        }

        #endregion

        private System.Windows.Forms.Panel panel1;
    }
}

以上、Windows Formで動的にコントロールを配置する方法についてでした。