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

TableLayoutPanelの行数や列数を取得、変更する

行数や列数を取得する

TableLayoutPanelコントロールの行数や列数を取得するには、それぞれTableLayoutPanel.RowCountプロパティTableLayoutPanel.ColumnCountプロパティを使います。

ただし、動的にTableLayoutPanelに子コントロールを追加している場合は、これらのプロパティが実際の列数や行数と一致していない可能性があります。「TableLayoutPanelに動的にコントロールを追加する」で説明したように、すでにすべてのセルがコントロールでうめられている時に新たなコントロールを追加すると、GrowStyleプロパティの値によっては、行または列が1つ増えます。しかしその時でもColumnCountとRowCountプロパティの値は変わりませんので、実際の行数、列数と違いが出てしまいます。つまり、これらのプロパティはTableLayoutPanelのGrowStyleプロパティがFixedSizeの場合のみ実際の列数や行数と必ず一致するということになります。

それでは実際の列数と行数を取得するにはどのようにすればよいかというと、...これがよく分かりません。TableLayoutPanelに配置されているすべてのコントロールの実際の位置をGetPositionFromControlで取得して、その最大値とColumnCountまたはRowCountの大きい方が実際の列数または行数であるとする以外に良い方法が今のところ見つかりません。

VB.NET
コードを隠すコードを選択
''' <summary>
''' TableLayoutPanelコントロールの実際の列の数を返す
''' </summary>
''' <param name="tlp">列数を取得するTableLayoutPanelコントロール</param>
''' <returns>tlpの列数</returns>
Public Shared Function GetRealColumnCount(ByVal tlp As TableLayoutPanel) _
        As Integer
    Dim maxColumn As Integer = tlp.ColumnCount - 1
    For Each c As Control In tlp.Controls
        maxColumn = Math.Max(maxColumn, tlp.GetPositionFromControl(c).Column)
    Next
    Return maxColumn + 1
End Function

''' <summary>
''' TableLayoutPanelコントロールの実際の行の数を返す
''' </summary>
''' <param name="tlp">行数を取得するTableLayoutPanelコントロール</param>
''' <returns>tlpの行数</returns>
Public Shared Function GetRealRowCount(ByVal tlp As TableLayoutPanel) _
        As Integer
    Dim maxRow As Integer = tlp.RowCount - 1
    For Each c As Control In tlp.Controls
        maxRow = Math.Max(maxRow, tlp.GetPositionFromControl(c).Row)
    Next
    Return maxRow + 1
End Function
C#
コードを隠すコードを選択
/// <summary>
/// TableLayoutPanelコントロールの実際の列の数を返す
/// </summary>
/// <param name="tlp">列数を取得するTableLayoutPanelコントロール</param>
/// <returns>tlpの列数</returns>
public static int GetRealColumnCount(TableLayoutPanel tlp)
{
    int maxColumn = tlp.ColumnCount - 1;
    foreach (Control c in tlp.Controls)
    {
        maxColumn = Math.Max(maxColumn, tlp.GetPositionFromControl(c).Column);
    }
    return maxColumn + 1;
}

/// <summary>
/// TableLayoutPanelコントロールの実際の行の数を返す
/// </summary>
/// <param name="tlp">行数を取得するTableLayoutPanelコントロール</param>
/// <returns>tlpの行数</returns>
public static int GetRealRowCount(TableLayoutPanel tlp)
{
    int maxRow = tlp.RowCount - 1;
    foreach (Control c in tlp.Controls)
    {
        maxRow = Math.Max(maxRow, tlp.GetPositionFromControl(c).Row);
    }
    return maxRow + 1;
}

行数や列数を変更する

TableLayoutPanel.RowCountプロパティTableLayoutPanel.ColumnCountプロパティの値を変更することによって、TableLayoutPanelコントロールの行数と列数を変更できます。RowCountプロパティの値を増やせば、最終に新しい行が追加される形で行が増えます。減らせば、最後の行が削除される形で行が減ります。

もしRowCountプロパティの値が減らされ、それによって削除されそうな行にコントロールが配置されていた場合は、TableLayoutPanel.GrowStyleプロパティの値によって結果が異なります。GrowStyleがAddRowsならば、行は削除されません。しかし、RowCountの値は指定された値となります(つまり、実際の行数と違う値になります)。GrowStyleがAddColumnsならば、行が削除され、削除された行にあったコントロールは新しく作られる列に移動します。ただしRowCountが0の時は、コントロールのある行は削除されず、そのまま残ります。GrowStyleがFixedSizeならば、例外ArgumentExceptionがスローされます。

GrowStyleがAddRowsかAddColumnsの時、RowCountとColumnCountを0にすると、最後の空白行と列だけが削除されます。

行や列を挿入する方法は「TableLayoutPanelの行や列を挿入する」で、行や列を削除する方法は「TableLayoutPanelの行や列を削除する」で説明します。

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

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