TableLayoutPanel上にあるコントロールのセルの位置を取得する方法として、GetCellPositionメソッドとGetPositionFromControlメソッドが用意されています。フォームデザイナを使ってすべての子コントロールをTableLayoutPanelに追加しており、その後変更しない場合は、この2つのメソッドは同じ値を返します。しかし、「TableLayoutPanelに動的にコントロールを追加する」のようにControls.Addで子コントロールを追加したり、SetCellPositionメソッドを使った場合は、2つのメソッドは異なる値を返す可能性があります。この時、コントロールが実際に占有しているセルの位置を取得するには、GetPositionFromControlメソッドを使います。GetCellPositionメソッドは、Controls.AddやSetCellPositionメソッドで指定された値を返します。
補足:GetColumnメソッドとGetRowメソッドはそれぞれ、GetCellPositionが返す座標の列と行を返します。
具体例を見てみましょう。例えば、次のようにしてTableLayoutPanelに2つのボタンを配置したとします。
TableLayoutPanel1.Controls.Add(Button1, 0, 0) TableLayoutPanel1.Controls.Add(Button2, 0, 0)
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のセルの行や列を拡大する」によってコントロールが複数のセルにまたがっている時でも、その位置のコントロールが返されます。
'(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
//(0, 0)の位置にあるコントロールを取得する Control c = TableLayoutPanel1.GetControlFromPosition(0, 0); if (c == null) { Console.WriteLine("(0, 0) の位置にコントロールはありません"); } else { Console.WriteLine("(0, 0) の位置にあるコントロールは{0}です", c.Name); }
注意:この記事では、基本的な事柄の説明が省略されているかもしれません。初心者の方は、特に以下の点にご注意ください。