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

TableLayoutPanelに動的にコントロールを追加する

Visual Studioのフォームデザイナを使ってTableLayoutPanelコントロールのセルにコントロールを配置するのは簡単で、説明する必要もないでしょう。ここでは、フォームデザイナではなく、コードで動的にコントロールを追加する方法を説明します。

TableLayoutPanelにコントロールを配置するには、Controls.Addメソッドを使います。もちろん挿入位置も指定できます。

TableLayoutPanelコントロールは一つのセルに一つのコントロールしか入れることができません。指定した挿入位置にすでにコントロールがあるときは、それ以降のコントロールが押し出されるように次のセルに移動します。

Controls.Addは挿入位置を指定しないで呼び出すこともできます。挿入位置を指定しなかった場合は、左上の空いているセルから順番に配置されます。(挿入位置に(-1, -1)を指定したことになります。)

すべてのセルがすでに埋まっている時に新しいコントロールを追加した時の動作は、TableLayoutPanel.GrowStyleプロパティで決まります。GrowStyleプロパティがAddRowsのとき(デフォルト)は行が1行増え、AddColumnsのときは列が1列増えます。FixedSizeのときは、例外ArgumentExceptionがスローされます。

次の例では、insertRowとinsertColumnで指定された位置にButtonコントロールを追加しています。挿入位置にコントロールがあるか調べ、無いときのみ挿入しています。

VB.NET
コードを隠すコードを選択
'挿入位置
Dim insertRow As Integer = 0
Dim insertColumn As Integer = 0

If TableLayoutPanel1.GetControlFromPosition( _
        insertColumn, insertRow) Is Nothing Then
    Dim newButton As New Button()
    newButton.Text = "Button"
    TableLayoutPanel1.Controls.Add(newButton, insertColumn, insertRow)
End If
C#
コードを隠すコードを選択
//挿入位置
int insertRow = 0;
int insertColumn = 0;

if (TableLayoutPanel1.GetControlFromPosition(insertColumn, insertRow) == null)
{
    Button newButton = new Button();
    newButton.Text = "Button";
    TableLayoutPanel1.Controls.Add(newButton, insertColumn, insertRow);
}

TableLayoutPanelコントロールを使って、コントロールを表形式で整列させる」にあるサンプル「TableLayoutPanel1.exe」で、コントロールの追加や、TableLayoutPanel.GrowStyleプロパティの動作を確認できますので、上の説明でよく分からないという方はお試しください。

Controls.Addで指定した位置に挿入できない問題

下のコードのように、TableLayoutPanelに3つのButtonを追加すると、Button3はどこに追加されるでしょうか?

VB.NET
コードを隠すコードを選択
TableLayoutPanel1.Controls.Add(Button1, 0, 0)
TableLayoutPanel1.Controls.Add(Button2, 0, 0)
TableLayoutPanel1.Controls.Add(Button3, 1, 0)
C#
コードを隠すコードを選択
TableLayoutPanel1.Controls.Add(Button1, 0, 0);
TableLayoutPanel1.Controls.Add(Button2, 0, 0);
TableLayoutPanel1.Controls.Add(Button3, 1, 0);

ちょっと意外ですが、Button3は(2, 0)の位置、つまり一番最後に追加されます。つまり、GetCellPositionが(0, 0)であるButton1とButton2が優先されるようなのです。

それでは、間違いなく指定した位置のセルにコントロールを配置するにはどうすればいいのかということになると、あまりいい方法が思いつきません。一つの方法として、次のように実際に配置されている位置をGetCellPositionが返す位置に強制的に設定してしまってから、コントロールを追加するやり方が考えられます。

VB.NET
コードを隠すコードを選択
Dim c As Control
For Each c In TableLayoutPanel1.Controls
    TableLayoutPanel1.SetCellPosition( _
        c, TableLayoutPanel1.GetPositionFromControl(c))
Next c
C#
コードを隠すコードを選択
foreach (Control c in TableLayoutPanel1.Controls)
{
    TableLayoutPanel1.SetCellPosition(
        c,
        TableLayoutPanel1.GetPositionFromControl(c));
}

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

  • .NET Tipsをご利用いただく際は、注意事項をお守りください。