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

TableLayoutPanelの行や列を削除する

注意:TableLayoutPanelコントロールは.NET Framework 2.0以降でのみ使用できます。

Visual Studioのフォームデザイナを使ってTableLayoutPanelコントロールの行や列を削除する方法は、「TableLayoutPanelコントロールを使って、コントロールを表形式で整列させる」で説明していますので、そちらをご覧ください。ここではコードによる方法を紹介します。

TableLayoutPanelの行や列を挿入する」と同じ方針で行ってみましょう。

以下の例では、removeRowの位置の行を削除しています。「TableLayoutPanelコントロールを使って、コントロールを表形式で整列させる」で紹介しているサンプル「TableLayoutPanel1.exe」からの抜粋です。

VB.NET
コードを隠すコードを選択
TableLayoutPanel1.SuspendLayout()

Dim c As Control
For Each c In TableLayoutPanel1.Controls
    Dim pos As TableLayoutPanelCellPosition = _
        TableLayoutPanel1.GetPositionFromControl(c)
    TableLayoutPanel1.SetCellPosition(c, pos)
    If TableLayoutPanel1.RowCount <= pos.Row Then
        TableLayoutPanel1.RowCount = pos.Row + 1
    End If
    If TableLayoutPanel1.ColumnCount <= pos.Column Then
        TableLayoutPanel1.ColumnCount = pos.Column + 1
    End If
Next c

'削除する列にあるコントロールを削除
Dim x As Integer
For x = 0 To TableLayoutPanel1.ColumnCount - 1
    c = TableLayoutPanel1.GetControlFromPosition(x, removeRow)
    If Not (c Is Nothing) Then
        TableLayoutPanel1.Controls.Remove(c)
    End If
Next x

'コントロールを移動
Dim y As Integer
For y = removeRow + 1 To TableLayoutPanel1.RowCount - 1
    For x = 0 To TableLayoutPanel1.ColumnCount - 1
        c = TableLayoutPanel1.GetControlFromPosition(x, y)
        If Not (c Is Nothing) Then
            TableLayoutPanel1.SetCellPosition( _
                c, New TableLayoutPanelCellPosition(x, y - 1))
        End If
    Next x
Next y

'列を減らす
If TableLayoutPanel1.RowCount > 0 Then
    TableLayoutPanel1.RowCount -= 1
End If
'スタイルを削除
If TableLayoutPanel1.RowStyles.Count > removeRow Then
    TableLayoutPanel1.RowStyles.RemoveAt(removeRow)
End If

TableLayoutPanel1.ResumeLayout()
C#
コードを隠すコードを選択
tableLayoutPanel1.SuspendLayout();

foreach (Control c in tableLayoutPanel1.Controls)
{
    TableLayoutPanelCellPosition pos =
        tableLayoutPanel1.GetPositionFromControl(c);
    tableLayoutPanel1.SetCellPosition(c, pos);
    if (tableLayoutPanel1.RowCount <= pos.Row)
        tableLayoutPanel1.RowCount = pos.Row + 1;
    if (tableLayoutPanel1.ColumnCount <= pos.Column)
        tableLayoutPanel1.ColumnCount = pos.Column + 1;
}

//削除する列にあるコントロールを削除
for (int x = 0; x < tableLayoutPanel1.ColumnCount; x++)
{
    Control c = tableLayoutPanel1.GetControlFromPosition(x, removeRow);
    if (c != null)
    {
        tableLayoutPanel1.Controls.Remove(c);
    }
}

//コントロールを移動
for (int y = removeRow + 1; y < tableLayoutPanel1.RowCount; y++)
{
    for (int x = 0; x < tableLayoutPanel1.ColumnCount; x++)
    {
        Control c = tableLayoutPanel1.GetControlFromPosition(x, y);
        if (c != null)
        {
            tableLayoutPanel1.SetCellPosition(
                c, new TableLayoutPanelCellPosition(x, y - 1));
        }
    }
}

//列を減らす
if (tableLayoutPanel1.RowCount > 0)
    tableLayoutPanel1.RowCount--;

//スタイルを削除
if (tableLayoutPanel1.RowStyles.Count > removeRow)
{
    tableLayoutPanel1.RowStyles.RemoveAt(removeRow);
}

tableLayoutPanel1.ResumeLayout();

このように、実行時にTableLayoutPanelに行や列を挿入あるいは削除するのは簡単ではありません。.NET Frameworkにこのような機能が用意されていないということは、もしかしたら実行時にTableLayoutPanelに行や列を挿入、削除するのは好ましくないということかもしれません。

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

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