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

TableLayoutPanelの子コントロールの位置を取得する

TableLayoutPanel上にあるコントロールのセルの位置を取得する方法として、GetCellPositionメソッドGetPositionFromControlメソッドが用意されています。フォームデザイナを使ってすべての子コントロールをTableLayoutPanelに追加しており、その後変更しない場合は、この2つのメソッドは同じ値を返します。しかし、「TableLayoutPanelに動的にコントロールを追加する」のようにControls.Addで子コントロールを追加したり、SetCellPositionメソッドを使った場合は、2つのメソッドは異なる値を返す可能性があります。この時、コントロールが実際に占有しているセルの位置を取得するには、GetPositionFromControlメソッドを使います。GetCellPositionメソッドは、Controls.AddやSetCellPositionメソッドで指定された値を返します。

補足:GetColumnメソッドGetRowメソッドはそれぞれ、GetCellPositionが返す座標の列と行を返します。

具体例を見てみましょう。例えば、次のようにしてTableLayoutPanelに2つのボタンを配置したとします。

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

この時、GetPositionFromControlメソッドは実際のコントロールの位置と同じように、Button1が(0, 1)、Button2が(0, 0)を返します。しかしGetCellPositionメソッドは、両方とも(0, 0)となります。

挿入位置を指定しないでControls.Addを呼び出した時は(-1, -1)が指定されたことになるため、このように挿入されたコントロールはGetCellPositionメソッドでも(-1, -1)が返されます。

TableLayoutPanelのセルの行や列を拡大する」によってコントロールが複数のセルにまたがっている時は、一番左上の位置が返されるようです。

指定した位置にあるコントロールを取得する

指定した位置のセルを占有しているコントロールを取得するには、TableLayoutPanel.GetControlFromPositionメソッドを使います。指定したセルにコントロールが無いか非表示(VisibleプロパティがFalse)の場合は、Nothing(C#ではnull)を返します。

TableLayoutPanelのセルの行や列を拡大する」によってコントロールが複数のセルにまたがっている時でも、その位置のコントロールが返されます。

VB.NET
コードを隠すコードを選択
'(0, 0)の位置にあるコントロールを取得する
Dim c As Control = TableLayoutPanel1.GetControlFromPosition(0, 0)
If c Is Nothing Then
    Console.WriteLine("(0, 0) の位置にコントロールはありません")
Else
    Console.WriteLine("(0, 0) の位置にあるコントロールは{0}です", c.Name)
End If
C#
コードを隠すコードを選択
//(0, 0)の位置にあるコントロールを取得する
Control c = TableLayoutPanel1.GetControlFromPosition(0, 0);
if (c == null)
{
    Console.WriteLine("(0, 0) の位置にコントロールはありません");
}
else
{
    Console.WriteLine("(0, 0) の位置にあるコントロールは{0}です", c.Name);
}

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

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