Visual Studioのフォームデザイナを使ってTableLayoutPanelコントロールのセルにコントロールを配置するのは簡単で、説明する必要もないでしょう。ここでは、フォームデザイナではなく、コードで動的にコントロールを追加する方法を説明します。
TableLayoutPanelにコントロールを配置するには、Controls.Addメソッドを使います。もちろん挿入位置も指定できます。
TableLayoutPanelコントロールは一つのセルに一つのコントロールしか入れることができません。指定した挿入位置にすでにコントロールがあるときは、それ以降のコントロールが押し出されるように次のセルに移動します。
Controls.Addは挿入位置を指定しないで呼び出すこともできます。挿入位置を指定しなかった場合は、左上の空いているセルから順番に配置されます。(挿入位置に(-1, -1)を指定したことになります。)
すべてのセルがすでに埋まっている時に新しいコントロールを追加した時の動作は、TableLayoutPanel.GrowStyleプロパティで決まります。GrowStyleプロパティがAddRowsのとき(デフォルト)は行が1行増え、AddColumnsのときは列が1列増えます。FixedSizeのときは、例外ArgumentExceptionがスローされます。
次の例では、insertRowとinsertColumnで指定された位置にButtonコントロールを追加しています。挿入位置にコントロールがあるか調べ、無いときのみ挿入しています。
'挿入位置 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
//挿入位置 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プロパティの動作を確認できますので、上の説明でよく分からないという方はお試しください。
下のコードのように、TableLayoutPanelに3つのButtonを追加すると、Button3はどこに追加されるでしょうか?
TableLayoutPanel1.Controls.Add(Button1, 0, 0) TableLayoutPanel1.Controls.Add(Button2, 0, 0) TableLayoutPanel1.Controls.Add(Button3, 1, 0)
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が返す位置に強制的に設定してしまってから、コントロールを追加するやり方が考えられます。
Dim c As Control For Each c In TableLayoutPanel1.Controls TableLayoutPanel1.SetCellPosition( _ c, TableLayoutPanel1.GetPositionFromControl(c)) Next c
foreach (Control c in TableLayoutPanel1.Controls) { TableLayoutPanel1.SetCellPosition( c, TableLayoutPanel1.GetPositionFromControl(c)); }
注意:この記事では、基本的な事柄の説明が省略されているかもしれません。初心者の方は、特に以下の点にご注意ください。